diff --git a/lib/NeuraDialect/Transforms/GenerateCodePass.cpp b/lib/NeuraDialect/Transforms/GenerateCodePass.cpp index 086294ed..88868849 100644 --- a/lib/NeuraDialect/Transforms/GenerateCodePass.cpp +++ b/lib/NeuraDialect/Transforms/GenerateCodePass.cpp @@ -124,16 +124,27 @@ static std::string getOpcode(Operation *op) { return opcode; } -// Literals for CONSTANT's sources, e.g. "#10" / "#0" / "#3.0". +// Literals for CONSTANT operations, e.g. "#10" / "#0" / "#3.0". static std::string getConstantLiteral(Operation *op) { - if (!isConstant(op)) return ""; - if (auto value_attr = op->getAttr("value")) { - if (auto integer_attr = dyn_cast(value_attr)) + if (isConstant(op)) { + if (auto value_attr = op->getAttr("value")) { + if (auto integer_attr = dyn_cast(value_attr)) + return "#" + std::to_string(integer_attr.getInt()); + if (auto float_attr = dyn_cast(value_attr)) + return "#" + std::to_string(float_attr.getValueAsDouble()); + } + return "#0"; + } + + // Checks for constant_value attribute in non-CONSTANT operations. + if (auto constant_value_attr = op->getAttr("constant_value")) { + if (auto integer_attr = dyn_cast(constant_value_attr)) return "#" + std::to_string(integer_attr.getInt()); - if (auto float_attr = dyn_cast(value_attr)) + if (auto float_attr = dyn_cast(constant_value_attr)) return "#" + std::to_string(float_attr.getValueAsDouble()); } - return "#0"; + + return ""; } // ----- Topology from Architecture -----. @@ -295,8 +306,8 @@ struct GenerateCodePass // - collect DATA_MOV and CTRL_MOV ops. // - collect reserve_to_phi_maps (PHI's operand#0 is the reserve). void indexIR(func::FuncOp function, - SmallVector &dataMovs, - SmallVector &ctrlMovs, + SmallVector &data_movs, + SmallVector &ctrl_movs, DenseMap &reserve_to_phi_map) { function.walk([&](Operation *op) { // placement for every op (even for mov/reserve). @@ -308,8 +319,8 @@ struct GenerateCodePass } // collect forwarders. - if (isDataMov(op)) { dataMovs.push_back(op); return; } - if (isCtrlMov(op)) { ctrlMovs.push_back(op); return; } + if (isDataMov(op)) { data_movs.push_back(op); return; } + if (isCtrlMov(op)) { ctrl_movs.push_back(op); return; } // skip Reserve from materialization. if (isReserve(op)) return; @@ -324,7 +335,11 @@ struct GenerateCodePass if (isConstant(op)) { inst.src_operands.emplace_back(getConstantLiteral(op), "RED"); + } else if (op->getAttr("constant_value")) { + // Checks if operation has constant_value attribute (for non-CONSTANT operations). + inst.src_operands.emplace_back(getConstantLiteral(op), "RED"); } else { + // Handles normal operands. SmallVector operands; operands.reserve(op->getNumOperands()); for (Value v : op->getOperands()) { operands.push_back(v); @@ -348,7 +363,7 @@ struct GenerateCodePass static SmallVector getLinkChain(Operation *forwarder) { return collectLinkSteps(forwarder); } static SmallVector getRegisterSteps(Operation *forwarder) { return collectRegSteps(forwarder); } - // Validate forwarder op arities: DATA_MOV: at least 1 in/1 out; CTRL_MOV: at least 2 inputs (src,reserve). + // Validates forwarder op arities: DATA_MOV: at least 1 in/1 out; CTRL_MOV: at least 2 inputs (src,reserve). template bool validateForwarderShape(Operation *forwarder) { if constexpr (!IsCtrl) { @@ -358,7 +373,7 @@ struct GenerateCodePass } } - // Compute producer first-hop directions and consumer last-hop directions (or LOCAL if link-less). + // Computes producer first-hop directions and consumer last-hop directions (or LOCAL if link-less). std::pair computeDirections(const SmallVector &links, const Topology &topo) { StringRef producer_direction("LOCAL"); StringRef consumer_direction("LOCAL"); @@ -369,7 +384,7 @@ struct GenerateCodePass return {producer_direction, consumer_direction}; } - // Add producer endpoints (first-hop directions or local $reg when using same-tile register paths). + // Adds producer endpoints (first-hop directions or local $reg when using same-tile register paths). void setProducerDestination(Operation *producer, StringRef producer_direction, const SmallVector ®s) { if (auto *pi = getInstructionPointer(producer)) { if (!producer_direction.empty() && producer_direction != "LOCAL") { @@ -380,7 +395,7 @@ struct GenerateCodePass } } - // Emit router hops for multi-hop paths (from the second hop onwards). CTRL_MOV emits CTRL_MOV hops. + // Emits router hops for multi-hop paths (from the second hop onwards). CTRL_MOV emits CTRL_MOV hops. template void generateIntermediateHops(const SmallVector &links, const Topology &topo) { for (size_t i = 1; i < links.size(); ++i) { @@ -487,7 +502,7 @@ struct GenerateCodePass consumers = collectDataMovConsumers(forwarder); } - // Wire each consumer: prefer register rewiring; fallback to direction rewiring. + // Wires each consumer: prefer register rewiring; fallback to direction rewiring. for (auto &[consOp, atVal] : consumers) { if (!handleRegisterRewiring(consOp, atVal, regs, links, topo)) handleDirectionRewiring(consOp, atVal, consumer_direction, links, forwarder); @@ -542,7 +557,7 @@ struct GenerateCodePass ArrayConfig config{columns, rows, {}}; std::map, std::vector> tile_insts; - // Flatten and sort by timesteps. + // Flattens and sorts by timesteps. for (auto &[tile_key, timestep_map] : tile_time_instructions) { auto &flat = tile_insts[tile_key]; for (auto &[timestep, instruction_vec] : timestep_map) for (Instruction &inst : instruction_vec) flat.push_back(inst); @@ -571,21 +586,33 @@ struct GenerateCodePass for (const Tile &core : config.cores) { yaml_out << " - column: " << core.col_idx << "\n row: " << core.row_idx << "\n core_id: \"" << core.core_id << "\"\n entries:\n"; - int entry_id = 0; + + // Groups instructions by timestep. + std::map> timestep_groups; for (const Instruction &inst : core.entry.instructions) { - yaml_out << " - entry_id: \"entry" << entry_id++ << "\"\n instructions:\n" - << " - opcode: \"" << inst.opcode << "\"\n timestep: " << inst.time_step << "\n"; - // sources. - if (!inst.src_operands.empty()) { - yaml_out << " src_operands:\n"; - for (const Operand &opnd : inst.src_operands) - yaml_out << " - operand: \"" << opnd.operand << "\"\n color: \"" << opnd.color << "\"\n"; - } - // destinations. - if (!inst.dst_operands.empty()) { - yaml_out << " dst_operands:\n"; - for (const Operand &opnd : inst.dst_operands) - yaml_out << " - operand: \"" << opnd.operand << "\"\n color: \"" << opnd.color << "\"\n"; + timestep_groups[inst.time_step].push_back(&inst); + } + + yaml_out << " - entry_id: \"entry0\"\n instructions:\n"; + for (const auto ×tep_pair : timestep_groups) { + int timestep = timestep_pair.first; + const auto &operations = timestep_pair.second; + + yaml_out << " - timestep: " << timestep << "\n operations:\n"; + for (const Instruction *inst : operations) { + yaml_out << " - opcode: \"" << inst->opcode << "\"\n"; + // sources. + if (!inst->src_operands.empty()) { + yaml_out << " src_operands:\n"; + for (const Operand &opnd : inst->src_operands) + yaml_out << " - operand: \"" << opnd.operand << "\"\n color: \"" << opnd.color << "\"\n"; + } + // destinations. + if (!inst->dst_operands.empty()) { + yaml_out << " dst_operands:\n"; + for (const Operand &opnd : inst->dst_operands) + yaml_out << " - operand: \"" << opnd.operand << "\"\n color: \"" << opnd.color << "\"\n"; + } } } } @@ -614,17 +641,32 @@ struct GenerateCodePass for (const Tile &core : config.cores) { asm_out << "PE(" << core.col_idx << "," << core.row_idx << "):\n"; + + // Groups instructions by timestep. + std::map> timestep_groups; for (const Instruction &inst : core.entry.instructions) { - asm_out << "{\n " << inst.opcode; - for (const Operand &operand : inst.src_operands) asm_out << ", " << formatOperand(operand); - if (!inst.dst_operands.empty()) { - asm_out << " -> "; - for (size_t i = 0; i < inst.dst_operands.size(); ++i) { - if (i > 0) asm_out << ", "; - asm_out << formatOperand(inst.dst_operands[i]); + timestep_groups[inst.time_step].push_back(&inst); + } + + for (const auto ×tep_pair : timestep_groups) { + int timestep = timestep_pair.first; + const auto &instructions = timestep_pair.second; + + asm_out << "{\n"; + for (size_t i = 0; i < instructions.size(); ++i) { + const Instruction *inst = instructions[i]; + asm_out << " " << inst->opcode; + for (const Operand &operand : inst->src_operands) asm_out << ", " << formatOperand(operand); + if (!inst->dst_operands.empty()) { + asm_out << " -> "; + for (size_t j = 0; j < inst->dst_operands.size(); ++j) { + if (j > 0) asm_out << ", "; + asm_out << formatOperand(inst->dst_operands[j]); + } } + asm_out << "\n"; } - asm_out << " (t=" << inst.time_step << ")\n}\n"; + asm_out << "} (t=" << timestep << ")\n"; } asm_out << "\n"; } @@ -658,8 +700,8 @@ struct GenerateCodePass return &vec[idx]; } - // Replace the exact source slots in consumers that correspond to `value_at_consumer`, - // or fill the first UNRESOLVED placeholder if a 1:1 match wasn't found. + // Replaces the exact source slots in consumers that correspond to `value_at_consumer`, + // or fills the first UNRESOLVED placeholder if a 1:1 match wasn't found. void setConsumerSourceExact(Operation *consumer, Value value_at_consumer, const std::string &text) { Instruction *ci = getInstructionPointer(consumer); if (!ci) return; @@ -693,18 +735,16 @@ struct GenerateCodePass clearState(); // Single function-level walks: index + materialize + collect. - SmallVector dataMovs; - SmallVector ctrlMovs; + SmallVector data_movs; + SmallVector ctrl_movs; DenseMap reserve_to_phi_map; - indexIR(func, dataMovs, ctrlMovs, reserve_to_phi_map); + indexIR(func, data_movs, ctrl_movs, reserve_to_phi_map); - // Expand forwarders without re-walking IR. - for (Operation *op : dataMovs) + // Expands forwarders without re-walking IR. + for (Operation *op : data_movs) expandMovImpl(op, topo, /*unused*/reserve_to_phi_map); - for (Operation *op : ctrlMovs) + for (Operation *op : ctrl_movs) expandMovImpl(op, topo, reserve_to_phi_map); - - // Debug unresolveds, then dump outputs. logUnresolvedOperands(); ArrayConfig config = buildArrayConfig(columns, rows); diff --git a/test/code_gen/README.md b/test/code_gen/README.md index 140cbb34..4d7af99c 100644 --- a/test/code_gen/README.md +++ b/test/code_gen/README.md @@ -29,12 +29,13 @@ Each core contains: ### Instruction Format Each `entry` contains: -- `entry_id` — the (single-instruction) context ID -- `instructions` — a list with one item: - - `opcode` — e.g. `CONSTANT`, `DATA_MOV`, `PHI`, `ICMP`, `FADD`, … - - `timestep` — the per-tile cycle at which the instruction executes - - `src_operands` — inputs - - `dst_operands` — outputs +- `entry_id` — the execution context ID (typically "entry0" and can be extended to multiple entries in the future ) +- `instructions` — a list of instruction groups organized by timestep: + - `timestep` — the per-tile cycle at which the instruction group executes + - `operations` — a list of operations executed in this timestep + - `opcode` — e.g. `CONSTANT`, `DATA_MOV`, `PHI`, `ICMP`, `FADD`, `GRANT_ONCE`, `GRANT_PREDICATE`, `CTRL_MOV`, `NOT`, `RETURN` + - `src_operands` — inputs + - `dst_operands` — output Operands encode: - `#N` — immediate constant (e.g., `#10`) @@ -58,109 +59,91 @@ array_config: entries: - entry_id: "entry0" instructions: - - opcode: "CONSTANT" - timestep: 0 - src_operands: - - operand: "#0" - color: "RED" - dst_operands: - - operand: "EAST" - color: "RED" - - entry_id: "entry1" - instructions: - - opcode: "CONSTANT" - timestep: 1 - src_operands: - - operand: "#10" - color: "RED" - dst_operands: - - operand: "EAST" - color: "RED" + - timestep: 0 + operations: + - opcode: "CONSTANT" + src_operands: + - operand: "#0" + color: "RED" + dst_operands: + - operand: "EAST" + color: "RED" + - timestep: 1 + operations: + - opcode: "CONSTANT" + src_operands: + - operand: "#10" + color: "RED" + dst_operands: + - operand: "EAST" + color: "RED" + - timestep: 4 + operations: + - opcode: "DATA_MOV" + src_operands: + - operand: "EAST" + color: "RED" + dst_operands: + - operand: "NORTH" + color: "RED" - column: 1 - row: 1 - core_id: "5" - entries: - - entry_id: "entry0" - instructions: - - opcode: "PHI" - timestep: 2 - src_operands: - - operand: "EAST" - color: "RED" - - operand: "SOUTH" - color: "RED" - dst_operands: - - operand: "EAST" - color: "RED" - - entry_id: "entry1" - instructions: - - opcode: "ICMP" - timestep: 4 - src_operands: - - operand: "EAST" - color: "RED" - - operand: "SOUTH" - color: "RED" - dst_operands: - - operand: "EAST" - color: "RED" - - operand: "NORTH" - color: "RED" - - operand: "$22" - color: "RED" - - operand: "$21" - color: "RED" - - operand: "SOUTH" - color: "RED" - - operand: "$20" - color: "RED" - - column: 2 - row: 1 - core_id: "6" + row: 0 + core_id: "1" entries: - entry_id: "entry0" instructions: - - opcode: "ADD" - timestep: 3 - src_operands: - - operand: "WEST" - color: "RED" - - operand: "SOUTH" - color: "RED" - dst_operands: - - operand: "WEST" - color: "RED" - - operand: "$25" - color: "RED" - - entry_id: "entry1" - instructions: - - opcode: "FADD" - timestep: 5 - src_operands: - - operand: "$24" - color: "RED" - - operand: "NORTH" - color: "RED" - dst_operands: - - operand: "$26" - color: "RED" - - operand: "EAST" - color: "RED" + - timestep: 1 + operations: + - opcode: "GRANT_ONCE" + src_operands: + - operand: "WEST" + color: "RED" + dst_operands: + - operand: "NORTH" + color: "RED" + - timestep: 2 + operations: + - opcode: "GRANT_ONCE" + src_operands: + - operand: "WEST" + color: "RED" + dst_operands: + - operand: "$4" + color: "RED" + - timestep: 3 + operations: + - opcode: "PHI" + src_operands: + - operand: "$5" + color: "RED" + - operand: "$4" + color: "RED" + dst_operands: + - operand: "NORTH" + color: "RED" + - operand: "$4" + color: "RED" + - opcode: "DATA_MOV" + src_operands: + - operand: "EAST" + color: "RED" + dst_operands: + - operand: "WEST" + color: "RED" ``` #### What Each Tile Does: **PE(0,0) - Constant Generation Tile:** -- `entry0` @t=0: Generates constant value 0 and sends it eastward -- `entry1` @t=1: Generates constant value 10 (loop upper bound) and sends it eastward - -**PE(1,1) - Control Flow Tile:** -- `entry0` @t=2: Merges data flows from east and south using PHI operation -- `entry1` @t=4: Performs integer comparison (i < 10), broadcasts result to multiple destinations including registers $22, $21, $20 +- @t=0: Generates constant value 0 and sends it eastward +- @t=1: Generates constant value 10 (loop upper bound) and sends it eastward +- @t=4: Forwards data from east to north -**PE(2,1) - Arithmetic Tile:** -- `entry0` @t=3: Performs integer addition (i + 1) and stores result in register $25 -- `entry1` @t=5: Performs floating-point addition (accumulator + 3.0) and stores result in register $26 +**PE(1,0) - Control Flow Tile:** +- @t=1: Grants data from west to north +- @t=2: Grants data from west to register $4 +- @t=3: Merges data flows using PHI operation and forwards data from east to west +- @t=5: Performs conditional data authorization based on predicate conditions ## ASM Format Description @@ -168,36 +151,62 @@ The ASM format is a human-readable assembly-style view per tile. ### Basics - **PE(x,y)** — the tile coordinates -- **Format** — `OPCODE, [src …] -> [dst …] (t=TIMESTEP)` +- **Format** — Operations are grouped by timestep in `{}` blocks with `(t=TIMESTEP)` suffix +- **Operation format** — `OPCODE, [src …] -> [dst …]` or `OPCODE -> [dst …]` (for operations without source operands) - **Operand tokens** - `#N` — immediate (e.g., `#0`, `#10`, `#3.000000`) - - `$N` — local register (e.g., `$20`, `$22`, `$25`) + - `$N` — local register (e.g., `$4`, `$5`, `$8`) - `[operand]` — non-directional (reg/imm) - `[DIRECTION, COLOR]` — directional with routing color - e.g., `[EAST, RED]`, `[WEST, RED]`, `[NORTH, RED]`, `[SOUTH, RED]` ## Timing Execution Examples ### PE(0,0) -- @t=0: `CONSTANT [#0] -> [EAST]` - Generate constant 0 and send to east -- @t=1: `CONSTANT [#10] -> [EAST]` - Generate constant 10 (loop upper bound) and send to east -- @t=4: `DATA_MOV [EAST] -> [NORTH]` - Receive data from east and forward to north - -### PE(1,1) -- @t=2: `PHI [EAST], [SOUTH] -> [EAST]` - Merge data flows from east and south -- @t=4: `ICMP [EAST], [SOUTH] -> [EAST], [NORTH], [$22], [$21], [SOUTH], [$20]` - Integer Compare operation, broadcasting results to multiple targets -- @t=5: `NOT [$20] -> [EAST]` - Negate the value in register $20 -- @t=6: `GRANT_PREDICATE [WEST], [$21] -> [EAST]` - Data authorization based on predicate conditions -- @t=7: `CTRL_MOV [WEST] -> [$20]` - Control flow movement, updating register $20 - -### PE(2,1) -- @t=3: `ADD [WEST], [SOUTH] -> [WEST], [$25]` - Execute addition operation -- @t=4: `PHI [$24], [EAST] -> [$24]` - Data flow merging -- @t=5: `FADD [$24], [NORTH] -> [$26], [EAST]` - Execute floating-point addition -- @t=6: `GRANT_PREDICATE [$25], [$24] -> [WEST]` - Data authorization based on conditions +``` +{ + CONSTANT, [#0] -> [EAST, RED] +} (t=0) +{ + CONSTANT, [#10] -> [EAST, RED] +} (t=1) +{ + DATA_MOV, [EAST, RED] -> [NORTH, RED] +} (t=4) +``` + +### PE(1,0) +``` +{ + GRANT_ONCE, [WEST, RED] -> [NORTH, RED] +} (t=1) +{ + GRANT_ONCE, [WEST, RED] -> [$4] +} (t=2) +{ + PHI, [$5], [$4] -> [NORTH, RED], [$4] + DATA_MOV, [EAST, RED] -> [WEST, RED] +} (t=3) +{ + GRANT_PREDICATE, [$4], [NORTH, RED] -> [$5] +} (t=5) +``` + +### PE(2,0) +``` +{ + CONSTANT, [#1] -> [$8] +} (t=0) +{ + ADD, [WEST, RED], [SOUTH, RED] -> [WEST, RED], [$25] +} (t=3) +{ + FADD, [$24], [NORTH, RED] -> [$26], [EAST, RED] +} (t=5) +``` ## Notes / Known Limitations ### Current Implementation Constraints -- **One instruction per entry**: Multiple operations within a tile are currently emitted as separate entries to satisfy the simulator requirements. We will allow multiple instructions per entry in the future. +- **Timestep-based grouping**: Operations are grouped by timestep within each entry, allowing multiple operations to execute in the same cycle - **Default color scheme**: You'll typically see "RED" as the default virtual channel color in the YAML output -- **Entry-based scheduling**: Each execution context (entry) can only contain one instruction at a time +- **Entry-based scheduling**: Each execution context (entry) can contain multiple instructions organized by timestep diff --git a/test/code_gen/test_code_generate.mlir b/test/code_gen/test_code_generate.mlir index 37add24f..da04009f 100644 --- a/test/code_gen/test_code_generate.mlir +++ b/test/code_gen/test_code_generate.mlir @@ -145,557 +145,593 @@ func.func @loop_test() -> f32 { // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CONSTANT" -// YAML-NEXT: timestep: 0 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#0" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CONSTANT" -// YAML-NEXT: timestep: 1 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#10" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 4 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 0 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CONSTANT" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#0" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 1 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CONSTANT" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#10" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 4 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 1 // YAML-NEXT: row: 0 // YAML-NEXT: core_id: "1" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 1 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$4" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "PHI" -// YAML-NEXT: timestep: 3 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$5" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$4" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$4" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry3" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 3 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry4" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$4" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$5" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 1 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$4" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 3 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "PHI" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$5" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$4" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$4" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 5 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$4" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$5" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 2 // YAML-NEXT: row: 0 // YAML-NEXT: core_id: "2" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CONSTANT" -// YAML-NEXT: timestep: 0 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#1" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$8" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 1 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$8" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$8" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "PHI" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$8" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 0 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CONSTANT" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#1" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$8" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 1 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$8" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$8" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "PHI" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$8" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 3 // YAML-NEXT: row: 0 // YAML-NEXT: core_id: "3" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "RETURN" -// YAML-NEXT: timestep: 8 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 8 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "RETURN" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 0 // YAML-NEXT: row: 1 // YAML-NEXT: core_id: "4" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 5 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 1 // YAML-NEXT: row: 1 // YAML-NEXT: core_id: "5" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "PHI" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "ICMP" -// YAML-NEXT: timestep: 4 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$22" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$21" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$20" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "NOT" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$20" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry3" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: timestep: 6 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$21" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry4" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 6 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$20" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry5" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: timestep: 7 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$20" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$22" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry6" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CTRL_MOV" -// YAML-NEXT: timestep: 7 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$20" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "PHI" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 4 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "ICMP" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$22" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$21" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$20" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 5 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "NOT" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$20" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 6 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$21" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$20" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 7 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$20" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$22" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "CTRL_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$20" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 2 // YAML-NEXT: row: 1 // YAML-NEXT: core_id: "6" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "ADD" -// YAML-NEXT: timestep: 3 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$25" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "PHI" -// YAML-NEXT: timestep: 4 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$24" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$24" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "FADD" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$24" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$26" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry3" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$24" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry4" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: timestep: 6 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$25" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$24" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry5" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 6 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry6" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: timestep: 7 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$26" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$24" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry7" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CTRL_MOV" -// YAML-NEXT: timestep: 7 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry8" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CTRL_MOV" -// YAML-NEXT: timestep: 8 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 3 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "ADD" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$25" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 4 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "PHI" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$24" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$24" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 5 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "FADD" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$24" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$26" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$24" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 6 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$25" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$24" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 7 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$26" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$24" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "CTRL_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 8 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CTRL_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 3 // YAML-NEXT: row: 1 // YAML-NEXT: core_id: "7" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 3 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 6 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$28" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_PREDICATE" -// YAML-NEXT: timestep: 7 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "$28" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 3 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 6 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$28" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 7 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_PREDICATE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "$28" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 1 // YAML-NEXT: row: 2 // YAML-NEXT: core_id: "9" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 5 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 5 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 2 // YAML-NEXT: row: 2 // YAML-NEXT: core_id: "10" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 3 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$40" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry1" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "PHI" -// YAML-NEXT: timestep: 4 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "$40" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry2" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "DATA_MOV" -// YAML-NEXT: timestep: 6 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "WEST" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: - entry_id: "entry3" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CTRL_MOV" -// YAML-NEXT: timestep: 9 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "NORTH" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "$41" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 3 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$40" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 4 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "PHI" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "$40" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 6 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "DATA_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "WEST" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 9 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CTRL_MOV" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "NORTH" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "$41" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 3 // YAML-NEXT: row: 2 // YAML-NEXT: core_id: "11" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CONSTANT" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#0.000000" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CONSTANT" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#0.000000" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" // YAML-NEXT: - column: 2 // YAML-NEXT: row: 3 // YAML-NEXT: core_id: "14" // YAML-NEXT: entries: // YAML-NEXT: - entry_id: "entry0" // YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "CONSTANT" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: src_operands: -// YAML-NEXT: - operand: "#3.000000" -// YAML-NEXT: color: "RED" -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "SOUTH" -// YAML-NEXT: color: "RED" +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "CONSTANT" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#3.000000" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "SOUTH" +// YAML-NEXT: color: "RED" // ASM-LABEL: PE(0,0): -// ASM: CONSTANT, [#0] -> [EAST, RED] (t=0) -// ASM: CONSTANT, [#10] -> [EAST, RED] (t=1) -// ASM: DATA_MOV, [EAST, RED] -> [NORTH, RED] (t=4) +// ASM: { +// ASM: CONSTANT, [#0] -> [EAST, RED] +// ASM: } (t=0) +// ASM: { +// ASM: CONSTANT, [#10] -> [EAST, RED] +// ASM: } (t=1) +// ASM: { +// ASM: DATA_MOV, [EAST, RED] -> [NORTH, RED] +// ASM: } (t=4) // ASM-LABEL: PE(1,0): -// ASM: GRANT_ONCE, [WEST, RED] -> [NORTH, RED] (t=1) -// ASM: GRANT_ONCE, [WEST, RED] -> [$4] (t=2) -// ASM: PHI, [$5], [$4] -> [NORTH, RED], [$4] (t=3) -// ASM: DATA_MOV, [EAST, RED] -> [WEST, RED] (t=3) -// ASM: GRANT_PREDICATE, [$4], [NORTH, RED] -> [$5] (t=5) +// ASM: { +// ASM: GRANT_ONCE, [WEST, RED] -> [NORTH, RED] +// ASM: } (t=1) +// ASM: { +// ASM: GRANT_ONCE, [WEST, RED] -> [$4] +// ASM: } (t=2) +// ASM: { +// ASM: PHI, [$5], [$4] -> [NORTH, RED], [$4] +// ASM: DATA_MOV, [EAST, RED] -> [WEST, RED] +// ASM: } (t=3) +// ASM: { +// ASM: GRANT_PREDICATE, [$4], [NORTH, RED] -> [$5] +// ASM: } (t=5) // ASM-LABEL: PE(2,0): -// ASM: CONSTANT, [#1] -> [$8] (t=0) -// ASM: GRANT_ONCE, [$8] -> [$8] (t=1) -// ASM: PHI, [NORTH, RED], [$8] -> [NORTH, RED], [WEST, RED] (t=2) +// ASM: { +// ASM: CONSTANT, [#1] -> [$8] +// ASM: } (t=0) +// ASM: { +// ASM: GRANT_ONCE, [$8] -> [$8] +// ASM: } (t=1) +// ASM: { +// ASM: PHI, [NORTH, RED], [$8] -> [NORTH, RED], [WEST, RED] +// ASM: } (t=2) // ASM-LABEL: PE(3,0): -// ASM: RETURN, [NORTH, RED] (t=8) +// ASM: { +// ASM: RETURN, [NORTH, RED] +// ASM: } (t=8) // ASM-LABEL: PE(0,1): -// ASM: DATA_MOV, [SOUTH, RED] -> [EAST, RED] (t=5) +// ASM: { +// ASM: DATA_MOV, [SOUTH, RED] -> [EAST, RED] +// ASM: } (t=5) // ASM-LABEL: PE(1,1): -// ASM: PHI, [EAST, RED], [SOUTH, RED] -> [EAST, RED] (t=2) -// ASM: ICMP, [EAST, RED], [SOUTH, RED] -> [EAST, RED], [NORTH, RED], [$22], [$21], [SOUTH, RED], [$20] (t=4) -// ASM: NOT, [$20] -> [EAST, RED] (t=5) -// ASM: GRANT_PREDICATE, [WEST, RED], [$21] -> [EAST, RED] (t=6) -// ASM: DATA_MOV, [SOUTH, RED] -> [$20] (t=6) -// ASM: GRANT_PREDICATE, [$20], [$22] -> [EAST, RED] (t=7) -// ASM: CTRL_MOV, [WEST, RED] -> [$20] (t=7) +// ASM: { +// ASM: PHI, [EAST, RED], [SOUTH, RED] -> [EAST, RED] +// ASM: } (t=2) +// ASM: { +// ASM: ICMP, [EAST, RED], [SOUTH, RED] -> [EAST, RED], [NORTH, RED], [$22], [$21], [SOUTH, RED], [$20] +// ASM: } (t=4) +// ASM: { +// ASM: NOT, [$20] -> [EAST, RED] +// ASM: } (t=5) +// ASM: { +// ASM: GRANT_PREDICATE, [WEST, RED], [$21] -> [EAST, RED] +// ASM: DATA_MOV, [SOUTH, RED] -> [$20] +// ASM: } (t=6) +// ASM: { +// ASM: GRANT_PREDICATE, [$20], [$22] -> [EAST, RED] +// ASM: CTRL_MOV, [WEST, RED] -> [$20] +// ASM: } (t=7) // ASM-LABEL: PE(2,1): -// ASM: ADD, [WEST, RED], [SOUTH, RED] -> [WEST, RED], [$25] (t=3) -// ASM: PHI, [$24], [EAST, RED] -> [$24] (t=4) -// ASM: FADD, [$24], [NORTH, RED] -> [$26], [EAST, RED] (t=5) -// ASM: DATA_MOV, [EAST, RED] -> [$24] (t=5) -// ASM: GRANT_PREDICATE, [$25], [$24] -> [WEST, RED] (t=6) -// ASM: DATA_MOV, [WEST, RED] -> [EAST, RED] (t=6) -// ASM: GRANT_PREDICATE, [$26], [NORTH, RED] -> [$24] (t=7) -// ASM: CTRL_MOV, [WEST, RED] -> [SOUTH, RED] (t=7) -// ASM: CTRL_MOV, [WEST, RED] -> [NORTH, RED] (t=8) +// ASM: { +// ASM: ADD, [WEST, RED], [SOUTH, RED] -> [WEST, RED], [$25] +// ASM: } (t=3) +// ASM: { +// ASM: PHI, [$24], [EAST, RED] -> [$24] +// ASM: } (t=4) +// ASM: { +// ASM: FADD, [$24], [NORTH, RED] -> [$26], [EAST, RED] +// ASM: DATA_MOV, [EAST, RED] -> [$24] +// ASM: } (t=5) +// ASM: { +// ASM: GRANT_PREDICATE, [$25], [$24] -> [WEST, RED] +// ASM: DATA_MOV, [WEST, RED] -> [EAST, RED] +// ASM: } (t=6) +// ASM: { +// ASM: GRANT_PREDICATE, [$26], [NORTH, RED] -> [$24] +// ASM: CTRL_MOV, [WEST, RED] -> [SOUTH, RED] +// ASM: } (t=7) +// ASM: { +// ASM: CTRL_MOV, [WEST, RED] -> [NORTH, RED] +// ASM: } (t=8) // ASM-LABEL: PE(3,1): -// ASM: GRANT_ONCE, [NORTH, RED] -> [WEST, RED] (t=3) -// ASM: DATA_MOV, [EAST, RED] -> [$28] (t=6) -// ASM: GRANT_PREDICATE, [$28], [WEST, RED] -> [SOUTH, RED] (t=7) +// ASM: { +// ASM: GRANT_ONCE, [NORTH, RED] -> [WEST, RED] +// ASM: } (t=3) +// ASM: { +// ASM: DATA_MOV, [EAST, RED] -> [$28] +// ASM: } (t=6) +// ASM: { +// ASM: GRANT_PREDICATE, [$28], [WEST, RED] -> [SOUTH, RED] +// ASM: } (t=7) // ASM-LABEL: PE(1,2): -// ASM: DATA_MOV, [SOUTH, RED] -> [EAST, RED] (t=5) -// ASM: DATA_MOV, [EAST, RED] -> [SOUTH, RED] (t=5) +// ASM: { +// ASM: DATA_MOV, [SOUTH, RED] -> [EAST, RED] +// ASM: DATA_MOV, [EAST, RED] -> [SOUTH, RED] +// ASM: } (t=5) // ASM-LABEL: PE(2,2): -// ASM: GRANT_ONCE, [NORTH, RED] -> [$40] (t=3) -// ASM: PHI, [SOUTH, RED], [$40] -> [SOUTH, RED], [WEST, RED] (t=4) -// ASM: DATA_MOV, [WEST, RED] -> [SOUTH, RED] (t=6) -// ASM: CTRL_MOV, [NORTH, RED] -> [$41] (t=9) +// ASM: { +// ASM: GRANT_ONCE, [NORTH, RED] -> [$40] +// ASM: } (t=3) +// ASM: { +// ASM: PHI, [SOUTH, RED], [$40] -> [SOUTH, RED], [WEST, RED] +// ASM: } (t=4) +// ASM: { +// ASM: DATA_MOV, [WEST, RED] -> [SOUTH, RED] +// ASM: } (t=6) +// ASM: { +// ASM: CTRL_MOV, [NORTH, RED] -> [$41] +// ASM: } (t=9) // ASM-LABEL: PE(3,2): -// ASM: CONSTANT, [#0.000000] -> [SOUTH, RED] (t=2) +// ASM: { +// ASM: CONSTANT, [#0.000000] -> [SOUTH, RED] +// ASM: } (t=2) // ASM-LABEL: PE(2,3): -// ASM: CONSTANT, [#3.000000] -> [SOUTH, RED] (t=2) +// ASM: { +// ASM: CONSTANT, [#3.000000] -> [SOUTH, RED] +// ASM: } (t=2) diff --git a/test/mapping_quality/branch_for.mlir b/test/mapping_quality/branch_for.mlir index 421f85c1..e4eb55bf 100644 --- a/test/mapping_quality/branch_for.mlir +++ b/test/mapping_quality/branch_for.mlir @@ -308,25 +308,39 @@ func.func @loop_test() -> f32 { // YAML-NEXT: rows: 4 // YAML-NEXT: cores: // YAML-NEXT: - column: 0 -// YAML-NEXT: row: 1 -// YAML-NEXT: core_id: "4" -// YAML-NEXT: entries: -// YAML-NEXT: - entry_id: "entry0" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" +// YAML-NEXT: row: 1 +// YAML-NEXT: core_id: "4" +// YAML-NEXT: entries: +// YAML-NEXT: - entry_id: "entry0" +// YAML-NEXT: instructions: +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#3.000000" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" // ASM-LABEL: PE(0,1): -// ASM: GRANT_ONCE -> [EAST, RED] (t=2) +// ASM: { +// ASM: GRANT_ONCE, [#3.000000] -> [EAST, RED] +// ASM: } (t=2) // ASM-LABEL: PE(1,1): -// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=2) -// ASM: PHI, [$20], [WEST, RED] -> [NORTH, RED], [$20] (t=3) -// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=3) -// ASM: DATA_MOV, [SOUTH, RED] -> [$21] (t=5) -// ASM: CTRL_MOV, [EAST, RED] -> [NORTH, RED] (t=5) -// ASM: GRANT_PREDICATE, [$20], [$21] -> [$20] (t=6) \ No newline at end of file +// ASM: { +// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] +// ASM: } (t=2) +// ASM: { +// ASM: PHI, [$20], [WEST, RED] -> [NORTH, RED], [$20] +// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] +// ASM: } (t=3) +// ASM: { +// ASM: DATA_MOV, [SOUTH, RED] -> [$21] +// ASM: CTRL_MOV, [EAST, RED] -> [NORTH, RED] +// ASM: } (t=5) +// ASM: { +// ASM: GRANT_PREDICATE, [$20], [$21] -> [$20] +// ASM: } (t=6) \ No newline at end of file diff --git a/test/neura/ctrl/branch_for.mlir b/test/neura/ctrl/branch_for.mlir index a92492a6..8740fe10 100644 --- a/test/neura/ctrl/branch_for.mlir +++ b/test/neura/ctrl/branch_for.mlir @@ -308,25 +308,39 @@ func.func @loop_test() -> f32 { // YAML-NEXT: rows: 4 // YAML-NEXT: cores: // YAML-NEXT: - column: 0 -// YAML-NEXT: row: 1 -// YAML-NEXT: core_id: "4" -// YAML-NEXT: entries: -// YAML-NEXT: - entry_id: "entry0" -// YAML-NEXT: instructions: -// YAML-NEXT: - opcode: "GRANT_ONCE" -// YAML-NEXT: timestep: 2 -// YAML-NEXT: dst_operands: -// YAML-NEXT: - operand: "EAST" -// YAML-NEXT: color: "RED" +// YAML-NEXT: row: 1 +// YAML-NEXT: core_id: "4" +// YAML-NEXT: entries: +// YAML-NEXT: - entry_id: "entry0" +// YAML-NEXT: instructions: +// YAML-NEXT: - timestep: 2 +// YAML-NEXT: operations: +// YAML-NEXT: - opcode: "GRANT_ONCE" +// YAML-NEXT: src_operands: +// YAML-NEXT: - operand: "#3.000000" +// YAML-NEXT: color: "RED" +// YAML-NEXT: dst_operands: +// YAML-NEXT: - operand: "EAST" +// YAML-NEXT: color: "RED" // ASM-LABEL: PE(0,1): -// ASM: GRANT_ONCE -> [EAST, RED] (t=2) +// ASM: { +// ASM: GRANT_ONCE, [#3.000000] -> [EAST, RED] +// ASM: } (t=2) // ASM-LABEL: PE(1,1): -// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=2) -// ASM: PHI, [$20], [WEST, RED] -> [NORTH, RED], [$20] (t=3) -// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] (t=3) -// ASM: DATA_MOV, [SOUTH, RED] -> [$21] (t=5) -// ASM: CTRL_MOV, [EAST, RED] -> [NORTH, RED] (t=5) -// ASM: GRANT_PREDICATE, [$20], [$21] -> [$20] (t=6) \ No newline at end of file +// ASM: { +// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] +// ASM: } (t=2) +// ASM: { +// ASM: PHI, [$20], [WEST, RED] -> [NORTH, RED], [$20] +// ASM: DATA_MOV, [NORTH, RED] -> [EAST, RED] +// ASM: } (t=3) +// ASM: { +// ASM: DATA_MOV, [SOUTH, RED] -> [$21] +// ASM: CTRL_MOV, [EAST, RED] -> [NORTH, RED] +// ASM: } (t=5) +// ASM: { +// ASM: GRANT_PREDICATE, [$20], [$21] -> [$20] +// ASM: } (t=6) \ No newline at end of file