add operation tree printing, fix wrong data linking during selective assembly

This commit is contained in:
2026-11-08 17:31:25 +02:00
parent e8f3f76117
commit 0f0dac6a25
4 changed files with 69 additions and 8 deletions
+1 -1
View File
@@ -9,6 +9,6 @@ namespace Syntax
int prepare_token_vector(std::vector<Expression::Token>& tv); int prepare_token_vector(std::vector<Expression::Token>& tv);
std::vector<Expression::Operation> build_op_vector(const std::vector<Expression::Token>& tv); std::vector<Expression::Operation> build_op_vector(const std::vector<Expression::Token>& tv);
Expression::TreeNode ov_to_tree(const std::vector<Expression::Token>& tv, const std::vector<Expression::Operation>& ov); Expression::TreeNode ov_to_tree(const std::vector<Expression::Token>& tv, const std::vector<Expression::Operation>& ov);
void print_op_tree(const std::vector<Expression::Token>& tv, const std::vector<Expression::Operation>& ov); void print_op_tree(const Expression::TreeNode &node);
} }
+25 -4
View File
@@ -90,13 +90,29 @@ void assemble(
program.reserve(commands.size()); program.reserve(commands.size());
std::vector<bool> command_used;
for (int i = 0, l = commands.size(); i < l; i++)
{
command_used.emplace_back(false);
}
for (int i = 0, l = commands.size(); i < l; i++) for (int i = 0, l = commands.size(); i < l; i++)
{ {
int lowest_weight_idx = 0; int lowest_weight_idx = 0;
for (int j = 0, k = commands.size(); j < k; j++) for (int j = 0; j < l; j++)
{ {
if (commands[j].node->weight() < commands[lowest_weight_idx].node->weight()) if (!command_used[j])
{
pr_debug("Starting from " << j);
lowest_weight_idx = j;
break;
}
}
for (int j = lowest_weight_idx + 1; j < l; j++)
{
if (!command_used[j] && commands[j].node->weight() < commands[lowest_weight_idx].node->weight())
{ {
lowest_weight_idx = j; lowest_weight_idx = j;
} }
@@ -104,9 +120,14 @@ void assemble(
Command &cmd = commands[lowest_weight_idx]; Command &cmd = commands[lowest_weight_idx];
pr_debug("Selecting command idx=" << lowest_weight_idx << " with weight=" << cmd.node->weight()); pr_debug("Selecting command idx=" << lowest_weight_idx << " with weight=" << cmd.node->weight());
program.emplace_back(cmd.opcode, cmd.left_src * preload_mem + cmd.left_index, cmd.right_src * preload_mem + cmd.right_index, preload_mem + i); pr_debug(cmd.opcode << " "
<< cmd.left_src << " " << cmd.left_index << " "
<< cmd.right_src << " " << cmd.right_index << " "
<< preload_mem + lowest_weight_idx);
commands.erase(commands.begin() + lowest_weight_idx); program.emplace_back(cmd.opcode, cmd.left_src * preload_mem + cmd.left_index, cmd.right_src * preload_mem + cmd.right_index, preload_mem + lowest_weight_idx);
command_used[lowest_weight_idx] = true;
} }
} }
+1
View File
@@ -22,6 +22,7 @@ int main(int argc, char **argv)
std::vector<Expression::Operation> ov = Syntax::build_op_vector(tv); std::vector<Expression::Operation> ov = Syntax::build_op_vector(tv);
Expression::TreeNode root = Syntax::ov_to_tree(tv, ov); Expression::TreeNode root = Syntax::ov_to_tree(tv, ov);
Syntax::print_op_tree(root);
std::vector<DynamicPipeline::Command> program; std::vector<DynamicPipeline::Command> program;
std::array<double, DYN_PIPELINE_MEM_SIZE> memory; std::array<double, DYN_PIPELINE_MEM_SIZE> memory;
+42 -3
View File
@@ -1432,11 +1432,50 @@ Expression::TreeNode ov_to_tree(const std::vector<Expression::Token>& tv, const
return root; return root;
} }
static void descend_print_tree_node(const Expression::TreeNode& this_node, const int depth, const int leftnesses)
{
prs_info("");
for (int i = 0; i < depth - 1; i++)
{
if (leftnesses & (1 << i))
{
pri_info("│ ");
}
else
{
pri_info(" ");
}
}
if (depth > 0)
{
if (leftnesses & (1 << (depth - 1)))
{
pri_info("├─");
}
else
{
pri_info("└─");
}
}
pri_info(*this_node.o.to_math_str() << "\n");
if (this_node.l != nullptr)
{
descend_print_tree_node(*this_node.l, depth + 1, leftnesses | 1 << depth);
}
if (this_node.r != nullptr)
{
descend_print_tree_node(*this_node.r, depth + 1, leftnesses);
}
}
void print_op_tree(const Expression::TreeNode& root) void print_op_tree(const Expression::TreeNode& root)
{ {
(void) root; descend_print_tree_node(root, 0, 0);
std::vector<std::pair<Expression::TreeNode *, int>> items_to_display;
} }
} }