From 27d42336aa473314cc40732868942ec12aba57d4 Mon Sep 17 00:00:00 2001 From: uslstenn Date: Wed, 24 Jun 2026 18:49:47 +0300 Subject: [PATCH 01/11] Typing & Copy-paste refactoring --- src/uScope/converter.py | 27 ++++++++++----------------- src/uScope/main.py | 6 ++---- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/uScope/converter.py b/src/uScope/converter.py index 033982f..2a62699 100644 --- a/src/uScope/converter.py +++ b/src/uScope/converter.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Tuple +from typing import Dict, List, Optional, Tuple from tqdm import tqdm @@ -37,7 +37,7 @@ def __init__( self.stage_managers: Dict[PipelineStage, StageLaneManager] = {} self.func_units_managers: Dict[str, StageLaneManager] = {} - self.store_lane_manager: StageLaneManager = None + self.store_lane_manager: Optional[StageLaneManager] = None def convert(self, progress: bool = True) -> List[dict]: self._add_metadata() @@ -123,13 +123,14 @@ def _assign_lane_for_func_units( ) -> Tuple[int, int]: return self.func_units_managers[unit_name].assign_lane(start_time, end_time) + def _cname_for(self, instr: Instruction) -> str: + if instr.is_squashed: + return self.config.get_squashed_cname() + return self.config.get_color_for_instr(instr) + def _add_pipeline_stage_events(self, instr: Instruction): mnemonic = instr.mnemonic - cname = ( - self.config.get_squashed_cname() - if instr.is_squashed - else self.config.get_color_for_instr(instr) - ) + cname = self._cname_for(instr) active = [ (st, instr.stages[st]) @@ -181,11 +182,7 @@ def _add_execution_unit_events(self, instr: Instruction): pid, tid = self._assign_lane_for_func_units(unit, issue, complete) dur = complete - issue - cname = ( - self.config.get_squashed_cname() - if instr.is_squashed - else self.config.get_color_for_instr(instr) - ) + cname = self._cname_for(instr) self.duration_events.append( DurationEvent( @@ -242,11 +239,7 @@ def _add_store_completion_event(self, instr: Instruction): _, tid = self.store_lane_manager.assign_lane(retire_tick, store_tick) dur = store_tick - retire_tick - cname = ( - self.config.get_squashed_cname() - if instr.is_squashed - else self.config.get_color_for_instr(instr) - ) + cname = self._cname_for(instr) self.duration_events.append( DurationEvent( diff --git a/src/uScope/main.py b/src/uScope/main.py index a3776fd..053b95a 100644 --- a/src/uScope/main.py +++ b/src/uScope/main.py @@ -22,6 +22,7 @@ def main(): ) parser.add_argument( "--input-file", '-i', + required=True, help="Path to the input trace file (e.g., trace.out)" ) parser.add_argument( @@ -103,10 +104,7 @@ def main(): if args.output_file: output_file = args.output_file else: - if input_file.endswith('.out'): - output_file = input_file[:-4] + '.json' - else: - output_file = input_file + '.json' + output_file = str(Path(input_file).with_suffix('.json')) if args.gzip and not output_file.endswith('.gz'): output_file += '.gz' From 89a33ab3efc892260529127decd674a510453fa7 Mon Sep 17 00:00:00 2001 From: uslstenn Date: Thu, 25 Jun 2026 18:49:30 +0300 Subject: [PATCH 02/11] Colors updated Invalid cname was deleted --- src/uScope/configs/colors.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/uScope/configs/colors.json b/src/uScope/configs/colors.json index 58315c0..d8ca7f9 100644 --- a/src/uScope/configs/colors.json +++ b/src/uScope/configs/colors.json @@ -8,8 +8,7 @@ "IntMultDiv": [ "rail_animation", "cq_build_attempt_failed", - "terrible", - "head_dump_child_node_arrow" + "terrible" ], "FP_ALU": [ "good", @@ -38,7 +37,6 @@ "Matrix_Unit": [ "bad", "terrible", - "head_dump_child_node_arrow", "thread_state_uninterruptible" ], "System_Unit": [ From 15fed72f01d1c4622f3c7d4278c0a4b9fac8583a Mon Sep 17 00:00:00 2001 From: uslstenn Date: Thu, 25 Jun 2026 18:56:19 +0300 Subject: [PATCH 03/11] Introduced multicore tracings * CoreId was proposed to support mutlicore execution * Output was updated --- src/uScope/O3.py | 1 + src/uScope/main.py | 74 ++++++++++++++++++++++++++++++++------------ src/uScope/parser.py | 20 +++++++----- 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/src/uScope/O3.py b/src/uScope/O3.py index 2297f63..9e0db5c 100644 --- a/src/uScope/O3.py +++ b/src/uScope/O3.py @@ -36,6 +36,7 @@ class Instruction: stages: Dict[PipelineStage, int] stage_order: List[PipelineStage] store_tick: int = 0 + core_id: int = 0 @property def mnemonic(self): diff --git a/src/uScope/main.py b/src/uScope/main.py index 053b95a..c69d9a9 100644 --- a/src/uScope/main.py +++ b/src/uScope/main.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse +import os import sys import json import logging @@ -16,6 +17,32 @@ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") logger = logging.getLogger(__name__) + +def _make_output_path(output_dir: str, input_stem: str, core_id: int, gzip_enabled: bool) -> str: + output = str(Path(output_dir) / f"{input_stem}_{core_id}.json") + if gzip_enabled: + output += '.gz' + return output + + +def _convert_and_dump( + trace_parser: PipeViewParser, + config, + args, + output_file: str, + progress: bool, +): + converter = ChromeTracingConverter( + trace_parser, config, + args.exclude_exec, args.exclude_pipeline, + args.only_committed, args.store_completions, + ) + events = converter.convert(progress=progress) + logger.info(f"Writing {output_file}") + with (gzip.open if args.gzip else open)(output_file, 'wt', encoding='utf-8') as f: + json.dump(events, f, indent=2) + return len(events) + def main(): parser = argparse.ArgumentParser( description="Convert gem5 O3PipeView trace to Perfetto / Chrome Tracing JSON format." @@ -26,8 +53,9 @@ def main(): help="Path to the input trace file (e.g., trace.out)" ) parser.add_argument( - "--output-file", "-o", - help="Output JSON file name. If not specified, it will be derived from input_file" + "--output-dir", "-o", + default=".", + help="Output directory for JSON traces. Defaults to current directory." ) parser.add_argument( "--config-path", "-c", @@ -100,19 +128,14 @@ def main(): logging.getLogger().setLevel(logging.WARNING) input_file = args.input_file - - if args.output_file: - output_file = args.output_file - else: - output_file = str(Path(input_file).with_suffix('.json')) - - if args.gzip and not output_file.endswith('.gz'): - output_file += '.gz' + output_dir = args.output_dir try: if not Path(input_file).exists(): raise FileNotFoundError(f"Input file not found: {input_file}") + os.makedirs(output_dir, exist_ok=True) + logger.info(f"Parsing {input_file}") trace_parser = PipeViewParser() trace_parser.parse_file(input_file) @@ -121,18 +144,29 @@ def main(): raise ValueError("No instructions with valid timestamps found") logger.info(f"Loading configuration from {args.config_path if args.config_path else 'default location'}") - config = load_config(args.config_path) - converter = ChromeTracingConverter(trace_parser, config, args.exclude_exec, args.exclude_pipeline, args.only_committed, args.store_completions) - events = converter.convert(progress=not args.quiet) - - logger.info(f"Writing {output_file}") - - with (gzip.open if args.gzip else open)(output_file, 'wt', encoding='utf-8') as f: - json.dump(events, f, indent=2) - - logger.info(f"Total events: {len(events)}") + all_instructions = trace_parser.instructions + core_ids = trace_parser.get_core_ids() + input_stem = Path(input_file).stem + progress = not args.quiet + + if len(core_ids) == 1: + core_id = core_ids[0] + core_output = _make_output_path(output_dir, input_stem, core_id, args.gzip) + total = _convert_and_dump(trace_parser, config, args, core_output, progress) + logger.info(f"Total events: {total}") + else: + logger.info(f"Detected {len(core_ids)} cores: {core_ids}") + for core_id in core_ids: + trace_parser.instructions = { + seq: instr + for seq, instr in all_instructions.items() + if instr.core_id == core_id + } + core_output = _make_output_path(output_dir, input_stem, core_id, args.gzip) + total = _convert_and_dump(trace_parser, config, args, core_output, progress) + logger.info(f"Core {core_id}: {total} events") except ValueError as e: logging.error(f"Value error: {e}") diff --git a/src/uScope/parser.py b/src/uScope/parser.py index dd128fa..96b0354 100644 --- a/src/uScope/parser.py +++ b/src/uScope/parser.py @@ -6,6 +6,7 @@ class PipeViewParser: def __init__(self): self.instructions = {} + self.current_core_id = None self.current_seq_num = None self.current_instr = None self.stage_map = {f"{stage}": stage for stage in PipelineStage.order()} @@ -18,21 +19,24 @@ def parse_file(self, filename: str): self.parse_line(line) if self.current_instr is not None: - self.instructions[self.current_seq_num] = self.current_instr + self.instructions[(self.current_core_id, self.current_seq_num)] = self.current_instr self.instructions = { - seq: instr - for seq, instr in self.instructions.items() + key: instr + for key, instr in self.instructions.items() if any(tick > 0 for tick in instr.stages.values()) } + def get_core_ids(self): + return sorted(set(instr.core_id for instr in self.instructions.values())) + @staticmethod def _parse_fetch_line(rest: str): parts = rest.split(":", 5) if len(parts) != 6: return None - tick_str, pc, _, seq_str, disasm, opclass = parts - return int(tick_str), pc, int(seq_str), disasm.strip(), opclass.strip() + tick_str, pc, core_id_str, seq_str, disasm, opclass = parts + return int(tick_str), pc, int(core_id_str), int(seq_str), disasm.strip(), opclass.strip() @staticmethod def _parse_stage_line(rest: str): @@ -62,11 +66,12 @@ def parse_line(self, line: str): result = self._parse_fetch_line(rest[6:]) if result is None: return - tick, pc, seq_num, disasm, opclass = result + tick, pc, core_id, seq_num, disasm, opclass = result if self.current_instr is not None: - self.instructions[self.current_seq_num] = self.current_instr + self.instructions[(self.current_core_id, self.current_seq_num)] = self.current_instr + self.current_core_id = core_id self.current_seq_num = seq_num self.current_instr = Instruction( seq_num=seq_num, @@ -75,6 +80,7 @@ def parse_line(self, line: str): opclass=opclass, stages={}, stage_order=[], + core_id=core_id, ) self.current_instr.stages[PipelineStage.FETCH] = tick From c18aa3c76cffe3977ddeaa5239235cc4f6b3d14e Mon Sep 17 00:00:00 2001 From: uslstenn Date: Thu, 25 Jun 2026 18:56:31 +0300 Subject: [PATCH 04/11] Tests were updated --- tests/conftest.py | 2 +- tests/test_main.py | 6 ++++-- tests/test_parser.py | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index fdd1bed..7dd6425 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -40,7 +40,7 @@ def minimal_parser() -> PipeViewParser: PipelineStage.RETIRE, ], ) - parser.instructions = {1: instr} + parser.instructions = {(0, 1): instr} return parser diff --git a/tests/test_main.py b/tests/test_main.py index 810b461..b707689 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -20,15 +20,17 @@ def test_main_basic(tmp_path: Path, monkeypatch): """ input_file.write_text(content) - output_file = tmp_path.joinpath("output.json") + output_dir = tmp_path.joinpath("output") + output_dir.mkdir() monkeypatch.setattr( sys, "argv", - ["uscope", "--input-file", str(input_file), "--output-file", str(output_file)], + ["uscope", "--input-file", str(input_file), "--output-dir", str(output_dir)], ) main() + output_file = output_dir.joinpath("trace_0.json") assert output_file.exists() data = json.loads(output_file.read_text()) assert isinstance(data, list) diff --git a/tests/test_parser.py b/tests/test_parser.py index dffc25e..4cad3e9 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -36,11 +36,11 @@ def assert_instruction( assert instr.stages[stage] == expected, f"Stage {stage} value mismatch" -def assert_instructions(parser, expected, stage_order): +def assert_instructions(parser, expected, stage_order, core_id=0): assert len(parser.instructions) == len(expected) for seq_num, (pc, disasm, opclass, stages) in expected.items(): assert_instruction( - instr=parser.instructions[seq_num], + instr=parser.instructions[(core_id, seq_num)], seq_num=seq_num, pc=pc, disasm=disasm, @@ -168,7 +168,7 @@ def test_parse_missing_stages(trace_with_missing_stages): ), } assert_instructions(parser, expected, expected_order) - assert PipelineStage.DISPATCH not in parser.instructions[1].stages + assert PipelineStage.DISPATCH not in parser.instructions[(0, 1)].stages def test_parse_empty_lines(trace_with_empty_lines): From e0886ca9f1a461dba97ce379da49ac1de9ecc9de Mon Sep 17 00:00:00 2001 From: uslstenn Date: Fri, 26 Jun 2026 14:54:14 +0300 Subject: [PATCH 05/11] [example,infra] Reference example was updated with new UI --- .github/workflows/python-ci.yml | 6 +- examples/reference/reference.S | 2 + examples/reference/reference.json.gz | Bin 22620 -> 0 bytes examples/reference/reference.out | 1413 ++++++++++++------------ examples/reference/reference_0.json.gz | Bin 0 -> 22504 bytes 5 files changed, 736 insertions(+), 685 deletions(-) delete mode 100644 examples/reference/reference.json.gz create mode 100644 examples/reference/reference_0.json.gz diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index bd6aef1..d8b48d7 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -36,12 +36,12 @@ jobs: - name: Run conversion on reference example run: | uScope --input-file examples/reference/reference.out \ - --output-file reference.json + --output-dir res/ - name: Compare output with reference run: | - gunzip -c examples/reference/reference.json.gz > expected.json - diff -u reference.json expected.json + gunzip -c examples/reference/reference_0.json.gz > expected.json + diff -u reference_0.json expected.json - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 diff --git a/examples/reference/reference.S b/examples/reference/reference.S index e5283c2..ebf5e69 100644 --- a/examples/reference/reference.S +++ b/examples/reference/reference.S @@ -1,3 +1,5 @@ +.option norvc + .section .data .align 4 int_a: .word 10, 20 diff --git a/examples/reference/reference.json.gz b/examples/reference/reference.json.gz deleted file mode 100644 index 83b6b6bdc726694341d3594821e078d2341efaee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22620 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

&v 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 QT#yoRQ?2f3rce<55A_$^1ONa4 diff --git a/examples/reference/reference.out b/examples/reference/reference.out index f17a05a..fad7124 100644 --- a/examples/reference/reference.out +++ b/examples/reference/reference.out @@ -12,7 +12,7 @@ O3PipeView:dispatch:80500 O3PipeView:issue:80500 O3PipeView:complete:81000 O3PipeView:retire:137000:store:0 -O3PipeView:fetch:78500:0x00010148:0:2:ld a0, 548(a0):MemRead +O3PipeView:fetch:78500:0x00010148:0:2:ld a0, 532(a0):MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 @@ -33,14 +33,14 @@ O3PipeView:dispatch:80500 O3PipeView:issue:80500 O3PipeView:complete:81000 O3PipeView:retire:141500:store:0 -O3PipeView:fetch:78500:0x00010150:0:4:ld a1, 548(a1):MemRead +O3PipeView:fetch:78500:0x00010150:0:4:ld a1, 532(a1):MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 O3PipeView:issue:81000 O3PipeView:complete:81500 O3PipeView:retire:141000:store:0 -O3PipeView:fetch:78500:0x00010158:0:6:ld a2, 548(a2):MemRead +O3PipeView:fetch:78500:0x00010158:0:6:ld a2, 532(a2):MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 @@ -54,1284 +54,1333 @@ O3PipeView:dispatch:80500 O3PipeView:issue:136000 O3PipeView:complete:136500 O3PipeView:retire:189000:store:0 -O3PipeView:fetch:79000:0x00010164:0:9:lw a5, 0(a1):MemRead +O3PipeView:fetch:79000:0x0001017c:0:15:addi a0, a0, 4:IntAlu O3PipeView:decode:79500 O3PipeView:rename:80000 O3PipeView:dispatch:81000 +O3PipeView:issue:136000 +O3PipeView:complete:136500 +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:130000:0x00010180:0:16:addi a1, a1, 4:IntAlu +O3PipeView:decode:130500 +O3PipeView:rename:131000 +O3PipeView:dispatch:132000 O3PipeView:issue:140000 O3PipeView:complete:140500 -O3PipeView:retire:193500:store:0 -O3PipeView:fetch:130000:0x00010194:0:21:auipc a0, 1:IntAlu +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:130000:0x00010184:0:17:addi a2, a2, 4:IntAlu +O3PipeView:decode:130500 +O3PipeView:rename:131000 +O3PipeView:dispatch:132000 +O3PipeView:issue:140500 +O3PipeView:complete:141000 +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:130000:0x00010190:0:20:auipc a0, 1:IntAlu O3PipeView:decode:130500 O3PipeView:rename:131000 O3PipeView:dispatch:132000 O3PipeView:issue:132000 O3PipeView:complete:132500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130000:0x00010198:0:22:ld a0, 468(a0):MemRead +O3PipeView:fetch:130000:0x00010194:0:21:ld a0, 456(a0):MemRead O3PipeView:decode:130500 O3PipeView:rename:131000 O3PipeView:dispatch:132000 O3PipeView:issue:132500 O3PipeView:complete:133000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130000:0x0001019c:0:23:auipc a1, 1:IntAlu +O3PipeView:fetch:130000:0x00010198:0:22:auipc a1, 1:IntAlu O3PipeView:decode:130500 O3PipeView:rename:131000 O3PipeView:dispatch:132000 O3PipeView:issue:132000 O3PipeView:complete:132500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101a0:0:24:ld a1, 468(a1):MemRead +O3PipeView:fetch:130000:0x0001019c:0:23:ld a1, 456(a1):MemRead +O3PipeView:decode:130500 +O3PipeView:rename:131000 +O3PipeView:dispatch:132000 +O3PipeView:issue:132500 +O3PipeView:complete:133000 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:130500:0x000101a0:0:24:addi a3, zero, 2:IntAlu O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:132500 O3PipeView:complete:133000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101a4:0:25:addi a3, zero, 2:IntAlu +O3PipeView:fetch:130500:0x000101a4:0:25:lw a4, 0(a0):MemRead O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 -O3PipeView:issue:132500 -O3PipeView:complete:133000 +O3PipeView:issue:0 +O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101a8:0:26:lw a4, 0(a0):MemRead +O3PipeView:fetch:130500:0x000101a8:0:26:lw a5, 0(a1):MemRead O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101ac:0:27:lw a5, 0(a1):MemRead +O3PipeView:fetch:130500:0x000101ac:0:27:mul a6, a4, a5:IntMult O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101b0:0:28:mul a6, a4, a5:IntMult +O3PipeView:fetch:130500:0x000101b0:0:28:div a7, a4, a5:IntDiv O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101b4:0:29:div a7, a4, a5:IntDiv +O3PipeView:fetch:130500:0x000101b4:0:29:sw s2, 0(a2):MemWrite O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101b8:0:30:add s2, a6, a7:IntAlu +O3PipeView:fetch:130500:0x000101b8:0:30:addi a0, a0, 4:IntAlu O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130500:0x000101bc:0:31:sw s2, 0(a2):MemWrite +O3PipeView:fetch:130500:0x000101bc:0:31:addi a1, a1, 4:IntAlu O3PipeView:decode:131000 O3PipeView:rename:131500 O3PipeView:dispatch:132500 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:130000:0x00010180:0:16:addi a0, a0, 4:IntAlu -O3PipeView:decode:130500 -O3PipeView:rename:131000 -O3PipeView:dispatch:132000 -O3PipeView:issue:136000 -O3PipeView:complete:136500 -O3PipeView:retire:195000:store:0 -O3PipeView:fetch:130000:0x00010184:0:17:addi a1, a1, 4:IntAlu -O3PipeView:decode:130500 -O3PipeView:rename:131000 -O3PipeView:dispatch:132000 -O3PipeView:issue:140000 -O3PipeView:complete:140500 -O3PipeView:retire:195000:store:0 -O3PipeView:fetch:130000:0x00010188:0:18:addi a2, a2, 4:IntAlu -O3PipeView:decode:130500 -O3PipeView:rename:131000 -O3PipeView:dispatch:132000 -O3PipeView:issue:140500 -O3PipeView:complete:141000 -O3PipeView:retire:195000:store:0 -O3PipeView:fetch:130000:0x0001018c:0:19:addi a3, a3, -1:IntAlu +O3PipeView:fetch:130000:0x00010188:0:18:addi a3, a3, -1:IntAlu O3PipeView:decode:130500 O3PipeView:rename:131000 O3PipeView:dispatch:132000 O3PipeView:issue:132000 O3PipeView:complete:132500 -O3PipeView:retire:195000:store:0 -O3PipeView:fetch:130000:0x00010190:0:20:bne a3, zero, -48:IntAlu +O3PipeView:retire:194500:store:0 +O3PipeView:fetch:130000:0x0001018c:0:19:bne a3, zero, -44:IntAlu O3PipeView:decode:130500 O3PipeView:rename:131000 O3PipeView:dispatch:132000 O3PipeView:issue:132500 O3PipeView:complete:133000 -O3PipeView:retire:195000:store:0 +O3PipeView:retire:194500:store:0 O3PipeView:fetch:135500:0x00010160:0:32:lw a4, 0(a0):MemRead O3PipeView:decode:136000 O3PipeView:rename:136500 O3PipeView:dispatch:137500 O3PipeView:issue:137500 O3PipeView:complete:138000 -O3PipeView:retire:195000:store:0 +O3PipeView:retire:194500:store:0 O3PipeView:fetch:135500:0x00010164:0:33:lw a5, 0(a1):MemRead O3PipeView:decode:136000 O3PipeView:rename:136500 O3PipeView:dispatch:137500 O3PipeView:issue:140500 O3PipeView:complete:141000 -O3PipeView:retire:195000:store:0 -O3PipeView:fetch:79000:0x00010174:0:13:or s3, a4, a5:IntAlu -O3PipeView:decode:79500 -O3PipeView:rename:80000 -O3PipeView:dispatch:81000 -O3PipeView:issue:192500 -O3PipeView:complete:193000 -O3PipeView:retire:194000:store:0 -O3PipeView:fetch:79000:0x00010170:0:12:and s2, a4, a5:IntAlu -O3PipeView:decode:79500 -O3PipeView:rename:80000 -O3PipeView:dispatch:81000 -O3PipeView:issue:192500 -O3PipeView:complete:193000 -O3PipeView:retire:194000:store:0 -O3PipeView:fetch:79000:0x0001016c:0:11:sub a7, a4, a5:IntAlu -O3PipeView:decode:79500 -O3PipeView:rename:80000 -O3PipeView:dispatch:81000 -O3PipeView:issue:192500 -O3PipeView:complete:193000 -O3PipeView:retire:194000:store:0 -O3PipeView:fetch:79000:0x00010168:0:10:add a6, a4, a5:IntAlu +O3PipeView:retire:194500:store:0 +O3PipeView:fetch:79000:0x00010164:0:9:lw a5, 0(a1):MemRead O3PipeView:decode:79500 O3PipeView:rename:80000 O3PipeView:dispatch:81000 -O3PipeView:issue:192500 -O3PipeView:complete:193000 -O3PipeView:retire:194000:store:0 -O3PipeView:fetch:135500:0x00010168:0:34:add a6, a4, a5:IntAlu -O3PipeView:decode:136000 -O3PipeView:rename:136500 -O3PipeView:dispatch:137500 -O3PipeView:issue:192500 -O3PipeView:complete:193000 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:135500:0x0001016c:0:35:sub a7, a4, a5:IntAlu +O3PipeView:issue:140000 +O3PipeView:complete:140500 +O3PipeView:retire:193500:store:0 +O3PipeView:fetch:135500:0x0001017c:0:39:addi a0, a0, 4:IntAlu O3PipeView:decode:136000 O3PipeView:rename:136500 O3PipeView:dispatch:137500 -O3PipeView:issue:192500 -O3PipeView:complete:193000 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:136500:0x00010180:0:40:addi a0, a0, 4:IntAlu -O3PipeView:decode:137000 -O3PipeView:rename:137500 -O3PipeView:dispatch:138500 -O3PipeView:issue:138500 -O3PipeView:complete:139000 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:136500:0x00010184:0:41:addi a1, a1, 4:IntAlu +O3PipeView:issue:137500 +O3PipeView:complete:138000 +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:136500:0x00010180:0:40:addi a1, a1, 4:IntAlu O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:140500 O3PipeView:complete:141000 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:135500:0x00010178:0:38:add s4, a6, a7:IntAlu -O3PipeView:decode:136000 -O3PipeView:rename:136500 -O3PipeView:dispatch:137500 -O3PipeView:issue:193000 -O3PipeView:complete:193500 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:135500:0x00010174:0:37:or s3, a4, a5:IntAlu -O3PipeView:decode:136000 -O3PipeView:rename:136500 -O3PipeView:dispatch:137500 -O3PipeView:issue:193000 -O3PipeView:complete:193500 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:135500:0x00010170:0:36:and s2, a4, a5:IntAlu -O3PipeView:decode:136000 -O3PipeView:rename:136500 -O3PipeView:dispatch:137500 -O3PipeView:issue:193000 -O3PipeView:complete:193500 -O3PipeView:retire:195500:store:0 -O3PipeView:fetch:79000:0x00010178:0:14:add s4, a6, a7:IntAlu -O3PipeView:decode:79500 -O3PipeView:rename:80000 -O3PipeView:dispatch:81000 -O3PipeView:issue:193000 -O3PipeView:complete:193500 -O3PipeView:retire:194500:store:0 -O3PipeView:fetch:136500:0x00010188:0:42:addi a2, a2, 4:IntAlu +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:136500:0x00010184:0:41:addi a2, a2, 4:IntAlu O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:141000 O3PipeView:complete:141500 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:136500:0x0001018c:0:43:addi a3, a3, -1:IntAlu +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:136500:0x00010188:0:42:addi a3, a3, -1:IntAlu O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:138500 O3PipeView:complete:139000 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:136500:0x00010190:0:44:bne a3, zero, -48:IntAlu +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:136500:0x0001018c:0:43:bne a3, zero, -44:IntAlu O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:139000 O3PipeView:complete:139500 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:136500:0x00010194:0:45:auipc a0, 1:IntAlu +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:136500:0x00010190:0:44:auipc a0, 1:IntAlu O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:138500 O3PipeView:complete:139000 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:136500:0x00010198:0:46:ld a0, 468(a0):MemRead +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:136500:0x00010194:0:45:ld a0, 456(a0):MemRead O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:139000 O3PipeView:complete:139500 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:136500:0x0001019c:0:47:auipc a1, 1:IntAlu +O3PipeView:retire:195000:store:0 +O3PipeView:fetch:135500:0x0001016c:0:35:sub a7, a4, a5:IntAlu +O3PipeView:decode:136000 +O3PipeView:rename:136500 +O3PipeView:dispatch:137500 +O3PipeView:issue:192500 +O3PipeView:complete:193000 +O3PipeView:retire:194500:store:0 +O3PipeView:fetch:135500:0x00010168:0:34:add a6, a4, a5:IntAlu +O3PipeView:decode:136000 +O3PipeView:rename:136500 +O3PipeView:dispatch:137500 +O3PipeView:issue:192500 +O3PipeView:complete:193000 +O3PipeView:retire:194500:store:0 +O3PipeView:fetch:79000:0x00010174:0:13:or s3, a4, a5:IntAlu +O3PipeView:decode:79500 +O3PipeView:rename:80000 +O3PipeView:dispatch:81000 +O3PipeView:issue:192500 +O3PipeView:complete:193000 +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:79000:0x00010170:0:12:and s2, a4, a5:IntAlu +O3PipeView:decode:79500 +O3PipeView:rename:80000 +O3PipeView:dispatch:81000 +O3PipeView:issue:192500 +O3PipeView:complete:193000 +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:79000:0x0001016c:0:11:sub a7, a4, a5:IntAlu +O3PipeView:decode:79500 +O3PipeView:rename:80000 +O3PipeView:dispatch:81000 +O3PipeView:issue:192500 +O3PipeView:complete:193000 +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:79000:0x00010168:0:10:add a6, a4, a5:IntAlu +O3PipeView:decode:79500 +O3PipeView:rename:80000 +O3PipeView:dispatch:81000 +O3PipeView:issue:192500 +O3PipeView:complete:193000 +O3PipeView:retire:194000:store:0 +O3PipeView:fetch:136500:0x00010198:0:46:auipc a1, 1:IntAlu O3PipeView:decode:137000 O3PipeView:rename:137500 O3PipeView:dispatch:138500 O3PipeView:issue:138500 O3PipeView:complete:139000 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:137000:0x000101a0:0:48:ld a1, 468(a1):MemRead -O3PipeView:decode:137500 -O3PipeView:rename:138000 -O3PipeView:dispatch:139000 +O3PipeView:retire:195500:store:0 +O3PipeView:fetch:136500:0x0001019c:0:47:ld a1, 456(a1):MemRead +O3PipeView:decode:137000 +O3PipeView:rename:137500 +O3PipeView:dispatch:138500 O3PipeView:issue:139000 O3PipeView:complete:139500 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:137000:0x000101a4:0:49:addi a3, zero, 2:IntAlu +O3PipeView:retire:195500:store:0 +O3PipeView:fetch:137000:0x000101a0:0:48:addi a3, zero, 2:IntAlu O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 O3PipeView:issue:139000 O3PipeView:complete:139500 -O3PipeView:retire:196000:store:0 -O3PipeView:fetch:79000:0x0001017c:0:15:sw s4, 0(a2):MemWrite -O3PipeView:decode:79500 -O3PipeView:rename:80000 -O3PipeView:dispatch:81000 -O3PipeView:issue:193500 -O3PipeView:complete:194000 -O3PipeView:retire:195000:store:197000 -O3PipeView:fetch:137000:0x000101a8:0:50:lw a4, 0(a0):MemRead +O3PipeView:retire:195500:store:0 +O3PipeView:fetch:137000:0x000101a4:0:49:lw a4, 0(a0):MemRead O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 O3PipeView:issue:140500 O3PipeView:complete:141000 -O3PipeView:retire:196500:store:0 -O3PipeView:fetch:137000:0x000101ac:0:51:lw a5, 0(a1):MemRead +O3PipeView:retire:195500:store:0 +O3PipeView:fetch:137000:0x000101a8:0:50:lw a5, 0(a1):MemRead O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 O3PipeView:issue:141000 O3PipeView:complete:141500 -O3PipeView:retire:196500:store:0 -O3PipeView:fetch:137000:0x000101b0:0:52:mul a6, a4, a5:IntMult +O3PipeView:retire:195500:store:0 +O3PipeView:fetch:135500:0x00010174:0:37:or s3, a4, a5:IntAlu +O3PipeView:decode:136000 +O3PipeView:rename:136500 +O3PipeView:dispatch:137500 +O3PipeView:issue:193000 +O3PipeView:complete:193500 +O3PipeView:retire:194500:store:0 +O3PipeView:fetch:135500:0x00010170:0:36:and s2, a4, a5:IntAlu +O3PipeView:decode:136000 +O3PipeView:rename:136500 +O3PipeView:dispatch:137500 +O3PipeView:issue:193000 +O3PipeView:complete:193500 +O3PipeView:retire:194500:store:0 +O3PipeView:fetch:137000:0x000101ac:0:51:mul a6, a4, a5:IntMult O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 O3PipeView:issue:192500 O3PipeView:complete:194000 -O3PipeView:retire:196500:store:0 -O3PipeView:fetch:135500:0x0001017c:0:39:sw s4, 0(a2):MemWrite -O3PipeView:decode:136000 -O3PipeView:rename:136500 -O3PipeView:dispatch:137500 -O3PipeView:issue:193500 -O3PipeView:complete:194000 -O3PipeView:retire:195500:store:197500 -O3PipeView:fetch:182500:0x000101d0:0:60:auipc a0, 1:IntAlu +O3PipeView:retire:195500:store:0 +O3PipeView:fetch:182500:0x000101c8:0:58:auipc a0, 1:IntAlu O3PipeView:decode:183000 O3PipeView:rename:183500 O3PipeView:dispatch:184500 O3PipeView:issue:184500 O3PipeView:complete:185000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:182500:0x000101d8:0:62:auipc a1, 1:IntAlu +O3PipeView:fetch:182500:0x000101cc:0:59:ld a0, 424(a0):MemRead +O3PipeView:decode:183000 +O3PipeView:rename:183500 +O3PipeView:dispatch:184500 +O3PipeView:issue:185000 +O3PipeView:complete:185500 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:182500:0x000101d0:0:60:auipc a1, 1:IntAlu O3PipeView:decode:183000 O3PipeView:rename:183500 O3PipeView:dispatch:184500 O3PipeView:issue:184500 O3PipeView:complete:185000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101e0:0:64:auipc a2, 1:IntAlu +O3PipeView:fetch:182500:0x000101d4:0:61:ld a1, 424(a1):MemRead +O3PipeView:decode:183000 +O3PipeView:rename:183500 +O3PipeView:dispatch:184500 +O3PipeView:issue:185000 +O3PipeView:complete:185500 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:182500:0x000101d8:0:62:auipc a2, 1:IntAlu +O3PipeView:decode:183000 +O3PipeView:rename:183500 +O3PipeView:dispatch:184500 +O3PipeView:issue:184500 +O3PipeView:complete:185000 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:183000:0x000101e0:0:64:addi a3, zero, 2:IntAlu O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 O3PipeView:issue:185000 O3PipeView:complete:185500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101e8:0:66:addi a3, zero, 2:IntAlu +O3PipeView:fetch:183000:0x000101e4:0:65:flw ft0, 0(a0):FloatMemRead O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 -O3PipeView:issue:185000 -O3PipeView:complete:185500 +O3PipeView:issue:0 +O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101ec:0:67:flw ft0, 0(a0):FloatMemRead +O3PipeView:fetch:183000:0x000101e8:0:66:flw ft1, 0(a1):FloatMemRead O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101f0:0:68:flw ft1, 0(a1):FloatMemRead +O3PipeView:fetch:183000:0x000101ec:0:67:fadd_s ft2, ft0, ft1:FloatAdd O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101f4:0:69:fadd_s ft2, ft0, ft1:FloatAdd +O3PipeView:fetch:183000:0x000101f0:0:68:fsub_s ft3, ft0, ft1:FloatAdd O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101f8:0:70:fsub_s ft3, ft0, ft1:FloatAdd +O3PipeView:fetch:183000:0x000101f4:0:69:feq_s a4, ft0, ft1:FloatCmp O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101fc:0:71:feq_s a4, ft0, ft1:FloatCmp +O3PipeView:fetch:183000:0x000101f8:0:70:fsw ft2, 0(a2):FloatMemWrite O3PipeView:decode:183500 O3PipeView:rename:184000 O3PipeView:dispatch:185000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:182500:0x000101c0:0:56:addi a0, a0, 4:IntAlu -O3PipeView:decode:183000 -O3PipeView:rename:183500 -O3PipeView:dispatch:184500 -O3PipeView:issue:184500 -O3PipeView:complete:185000 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:182500:0x000101c4:0:57:addi a1, a1, 4:IntAlu -O3PipeView:decode:183000 -O3PipeView:rename:183500 -O3PipeView:dispatch:184500 -O3PipeView:issue:184500 -O3PipeView:complete:185000 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:182500:0x000101c8:0:58:addi a3, a3, -1:IntAlu +O3PipeView:fetch:183000:0x000101fc:0:71:addi a2, a2, 4:IntAlu +O3PipeView:decode:183500 +O3PipeView:rename:184000 +O3PipeView:dispatch:185000 +O3PipeView:issue:0 +O3PipeView:complete:0 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:137000:0x000101b8:0:54:addi a0, a0, 4:IntAlu +O3PipeView:decode:137500 +O3PipeView:rename:138000 +O3PipeView:dispatch:139000 +O3PipeView:issue:140500 +O3PipeView:complete:141000 +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:137000:0x000101bc:0:55:addi a1, a1, 4:IntAlu +O3PipeView:decode:137500 +O3PipeView:rename:138000 +O3PipeView:dispatch:139000 +O3PipeView:issue:141000 +O3PipeView:complete:141500 +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:182500:0x000101c0:0:56:addi a3, a3, -1:IntAlu O3PipeView:decode:183000 O3PipeView:rename:183500 O3PipeView:dispatch:184500 O3PipeView:issue:184500 O3PipeView:complete:185000 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:182500:0x000101cc:0:59:bne a3, zero, -36:IntAlu +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:182500:0x000101c4:0:57:bne a3, zero, -32:IntAlu O3PipeView:decode:183000 O3PipeView:rename:183500 O3PipeView:dispatch:184500 O3PipeView:issue:185000 O3PipeView:complete:185500 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:188000:0x000101a8:0:72:lw a4, 0(a0):MemRead +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:188000:0x000101a4:0:72:lw a4, 0(a0):MemRead O3PipeView:decode:188500 O3PipeView:rename:189000 O3PipeView:dispatch:190000 O3PipeView:issue:190000 O3PipeView:complete:190500 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:188000:0x000101ac:0:73:lw a5, 0(a1):MemRead +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:188000:0x000101a8:0:73:lw a5, 0(a1):MemRead O3PipeView:decode:188500 O3PipeView:rename:189000 O3PipeView:dispatch:190000 O3PipeView:issue:190000 O3PipeView:complete:190500 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:188000:0x000101b0:0:74:mul a6, a4, a5:IntMult +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:188000:0x000101ac:0:74:mul a6, a4, a5:IntMult O3PipeView:decode:188500 O3PipeView:rename:189000 O3PipeView:dispatch:190000 O3PipeView:issue:193500 O3PipeView:complete:195000 -O3PipeView:retire:204500:store:0 -O3PipeView:fetch:137000:0x000101b4:0:53:div a7, a4, a5:IntDiv -O3PipeView:decode:137500 -O3PipeView:rename:138000 -O3PipeView:dispatch:139000 -O3PipeView:issue:192500 -O3PipeView:complete:202500 O3PipeView:retire:203500:store:0 -O3PipeView:fetch:137000:0x000101b8:0:54:add s2, a6, a7:IntAlu -O3PipeView:decode:137500 -O3PipeView:rename:138000 -O3PipeView:dispatch:139000 -O3PipeView:issue:202500 -O3PipeView:complete:203000 -O3PipeView:retire:204000:store:0 -O3PipeView:fetch:137000:0x000101bc:0:55:sw s2, 0(a2):MemWrite +O3PipeView:fetch:137000:0x000101b0:0:52:div a7, a4, a5:IntDiv O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 -O3PipeView:issue:203000 -O3PipeView:complete:203500 -O3PipeView:retire:204500:store:206500 -O3PipeView:fetch:189000:0x000101c0:0:78:addi a0, a0, 4:IntAlu +O3PipeView:issue:192500 +O3PipeView:complete:202000 +O3PipeView:retire:203000:store:0 +O3PipeView:fetch:188000:0x000101b8:0:77:addi a0, a0, 4:IntAlu +O3PipeView:decode:188500 +O3PipeView:rename:189000 +O3PipeView:dispatch:190000 +O3PipeView:issue:190000 +O3PipeView:complete:190500 +O3PipeView:retire:205000:store:0 +O3PipeView:fetch:188000:0x000101bc:0:78:addi a1, a1, 4:IntAlu +O3PipeView:decode:188500 +O3PipeView:rename:189000 +O3PipeView:dispatch:190000 +O3PipeView:issue:190000 +O3PipeView:complete:190500 +O3PipeView:retire:205000:store:0 +O3PipeView:fetch:189000:0x000101c0:0:79:addi a3, a3, -1:IntAlu O3PipeView:decode:189500 O3PipeView:rename:190000 O3PipeView:dispatch:191000 O3PipeView:issue:191000 O3PipeView:complete:191500 -O3PipeView:retire:206000:store:0 -O3PipeView:fetch:189000:0x000101c4:0:79:addi a1, a1, 4:IntAlu +O3PipeView:retire:205000:store:0 +O3PipeView:fetch:189000:0x000101c4:0:80:bne a3, zero, -32:IntAlu +O3PipeView:decode:189500 +O3PipeView:rename:190000 +O3PipeView:dispatch:191000 +O3PipeView:issue:191500 +O3PipeView:complete:192000 +O3PipeView:retire:205000:store:0 +O3PipeView:fetch:189000:0x000101c8:0:81:auipc a0, 1:IntAlu O3PipeView:decode:189500 O3PipeView:rename:190000 O3PipeView:dispatch:191000 O3PipeView:issue:191000 O3PipeView:complete:191500 -O3PipeView:retire:206000:store:0 -O3PipeView:fetch:189000:0x000101c8:0:80:addi a3, a3, -1:IntAlu +O3PipeView:retire:205000:store:0 +O3PipeView:fetch:189000:0x000101cc:0:82:ld a0, 424(a0):MemRead +O3PipeView:decode:189500 +O3PipeView:rename:190000 +O3PipeView:dispatch:191000 +O3PipeView:issue:191500 +O3PipeView:complete:192000 +O3PipeView:retire:205000:store:0 +O3PipeView:fetch:189000:0x000101d0:0:83:auipc a1, 1:IntAlu O3PipeView:decode:189500 O3PipeView:rename:190000 O3PipeView:dispatch:191000 O3PipeView:issue:191000 O3PipeView:complete:191500 -O3PipeView:retire:206000:store:0 -O3PipeView:fetch:189000:0x000101cc:0:81:bne a3, zero, -36:IntAlu +O3PipeView:retire:205500:store:0 +O3PipeView:fetch:189000:0x000101d4:0:84:ld a1, 424(a1):MemRead O3PipeView:decode:189500 O3PipeView:rename:190000 O3PipeView:dispatch:191000 O3PipeView:issue:191500 O3PipeView:complete:192000 -O3PipeView:retire:206000:store:0 -O3PipeView:fetch:189000:0x000101d0:0:82:auipc a0, 1:IntAlu +O3PipeView:retire:205500:store:0 +O3PipeView:fetch:189000:0x000101d8:0:85:auipc a2, 1:IntAlu O3PipeView:decode:189500 O3PipeView:rename:190000 O3PipeView:dispatch:191000 O3PipeView:issue:191000 O3PipeView:complete:191500 -O3PipeView:retire:206000:store:0 -O3PipeView:fetch:188000:0x000101b4:0:75:div a7, a4, a5:IntDiv +O3PipeView:retire:205500:store:0 +O3PipeView:fetch:188000:0x000101b0:0:75:div a7, a4, a5:IntDiv O3PipeView:decode:188500 O3PipeView:rename:189000 O3PipeView:dispatch:190000 O3PipeView:issue:194000 O3PipeView:complete:204000 O3PipeView:retire:205000:store:0 -O3PipeView:fetch:188000:0x000101b8:0:76:add s2, a6, a7:IntAlu -O3PipeView:decode:188500 -O3PipeView:rename:189000 -O3PipeView:dispatch:190000 -O3PipeView:issue:204000 -O3PipeView:complete:204500 -O3PipeView:retire:205500:store:0 -O3PipeView:fetch:188000:0x000101bc:0:77:sw s2, 0(a2):MemWrite -O3PipeView:decode:188500 -O3PipeView:rename:189000 -O3PipeView:dispatch:190000 -O3PipeView:issue:204500 -O3PipeView:complete:205000 -O3PipeView:retire:206000:store:208000 -O3PipeView:fetch:182500:0x000101d4:0:61:ld a0, 432(a0):MemRead +O3PipeView:fetch:182500:0x000101dc:0:63:ld a2, 424(a2):MemRead O3PipeView:decode:183000 O3PipeView:rename:183500 O3PipeView:dispatch:184500 O3PipeView:issue:185000 O3PipeView:complete:185500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:189000:0x000101d8:0:84:auipc a1, 1:IntAlu -O3PipeView:decode:189500 -O3PipeView:rename:190000 -O3PipeView:dispatch:191000 -O3PipeView:issue:191000 -O3PipeView:complete:191500 -O3PipeView:retire:241500:store:0 -O3PipeView:fetch:189000:0x000101d4:0:83:ld a0, 432(a0):MemRead -O3PipeView:decode:189500 -O3PipeView:rename:190000 -O3PipeView:dispatch:191000 -O3PipeView:issue:191500 -O3PipeView:complete:192000 -O3PipeView:retire:241500:store:0 -O3PipeView:fetch:182500:0x000101dc:0:63:ld a1, 432(a1):MemRead -O3PipeView:decode:183000 -O3PipeView:rename:183500 -O3PipeView:dispatch:184500 -O3PipeView:issue:185000 -O3PipeView:complete:185500 -O3PipeView:retire:0:store:0 -O3PipeView:fetch:183000:0x000101e4:0:65:ld a2, 432(a2):MemRead -O3PipeView:decode:183500 -O3PipeView:rename:184000 -O3PipeView:dispatch:185000 -O3PipeView:issue:185500 -O3PipeView:complete:186000 -O3PipeView:retire:0:store:0 -O3PipeView:fetch:189500:0x000101e0:0:86:auipc a2, 1:IntAlu +O3PipeView:fetch:189500:0x000101e0:0:87:addi a3, zero, 2:IntAlu O3PipeView:decode:190000 O3PipeView:rename:190500 O3PipeView:dispatch:191500 O3PipeView:issue:191500 O3PipeView:complete:192000 -O3PipeView:retire:245500:store:0 -O3PipeView:fetch:189500:0x000101e8:0:88:addi a3, zero, 2:IntAlu -O3PipeView:decode:190000 -O3PipeView:rename:190500 -O3PipeView:dispatch:191500 +O3PipeView:retire:241500:store:0 +O3PipeView:fetch:189000:0x000101dc:0:86:ld a2, 424(a2):MemRead +O3PipeView:decode:189500 +O3PipeView:rename:190000 +O3PipeView:dispatch:191000 O3PipeView:issue:191500 O3PipeView:complete:192000 -O3PipeView:retire:245500:store:0 -O3PipeView:fetch:189500:0x000101ec:0:89:flw ft0, 0(a0):FloatMemRead +O3PipeView:retire:241500:store:0 +O3PipeView:fetch:189500:0x000101e4:0:88:flw ft0, 0(a0):FloatMemRead O3PipeView:decode:190000 O3PipeView:rename:190500 O3PipeView:dispatch:191500 -O3PipeView:issue:240500 -O3PipeView:complete:241000 -O3PipeView:retire:245500:store:0 -O3PipeView:fetch:189500:0x000101e4:0:87:ld a2, 432(a2):MemRead +O3PipeView:issue:193500 +O3PipeView:complete:194000 +O3PipeView:retire:246000:store:0 +O3PipeView:fetch:79000:0x00010178:0:14:sw s4, 0(a2):MemWrite +O3PipeView:decode:79500 +O3PipeView:rename:80000 +O3PipeView:dispatch:81000 +O3PipeView:issue:140500 +O3PipeView:complete:141000 +O3PipeView:retire:194000:store:249001 +O3PipeView:fetch:135500:0x00010178:0:38:sw s4, 0(a2):MemWrite +O3PipeView:decode:136000 +O3PipeView:rename:136500 +O3PipeView:dispatch:137500 +O3PipeView:issue:141000 +O3PipeView:complete:141500 +O3PipeView:retire:195000:store:249002 +O3PipeView:fetch:137000:0x000101b4:0:53:sw s2, 0(a2):MemWrite +O3PipeView:decode:137500 +O3PipeView:rename:138000 +O3PipeView:dispatch:139000 +O3PipeView:issue:193500 +O3PipeView:complete:194000 +O3PipeView:retire:203000:store:249003 +O3PipeView:fetch:188000:0x000101b4:0:76:sw s2, 0(a2):MemWrite +O3PipeView:decode:188500 +O3PipeView:rename:189000 +O3PipeView:dispatch:190000 +O3PipeView:issue:193500 +O3PipeView:complete:194000 +O3PipeView:retire:205000:store:249004 +O3PipeView:fetch:189500:0x000101e8:0:89:flw ft1, 0(a1):FloatMemRead O3PipeView:decode:190000 -O3PipeView:rename:190500 -O3PipeView:dispatch:191500 -O3PipeView:issue:192000 -O3PipeView:complete:192500 -O3PipeView:retire:245500:store:0 -O3PipeView:fetch:189000:0x000101dc:0:85:ld a1, 432(a1):MemRead -O3PipeView:decode:189500 -O3PipeView:rename:190000 -O3PipeView:dispatch:191000 -O3PipeView:issue:191500 -O3PipeView:complete:192000 -O3PipeView:retire:245500:store:0 -O3PipeView:fetch:189500:0x000101f0:0:90:flw ft1, 0(a1):FloatMemRead +O3PipeView:rename:190500 +O3PipeView:dispatch:191500 +O3PipeView:issue:193500 +O3PipeView:complete:194000 +O3PipeView:retire:250000:store:0 +O3PipeView:fetch:189500:0x000101fc:0:94:addi a2, a2, 4:IntAlu O3PipeView:decode:190000 O3PipeView:rename:190500 O3PipeView:dispatch:191500 -O3PipeView:issue:244500 -O3PipeView:complete:245000 -O3PipeView:retire:247000:store:0 -O3PipeView:fetch:234500:0x00010204:0:95:addi a2, a2, 4:IntAlu +O3PipeView:issue:240500 +O3PipeView:complete:241000 +O3PipeView:retire:251500:store:0 +O3PipeView:fetch:234500:0x00010204:0:96:addi a2, a2, 4:IntAlu +O3PipeView:decode:235000 +O3PipeView:rename:235500 +O3PipeView:dispatch:236500 +O3PipeView:issue:241000 +O3PipeView:complete:241500 +O3PipeView:retire:251500:store:0 +O3PipeView:fetch:234500:0x00010208:0:97:addi a0, a0, 4:IntAlu O3PipeView:decode:235000 O3PipeView:rename:235500 O3PipeView:dispatch:236500 -O3PipeView:issue:244500 -O3PipeView:complete:245000 -O3PipeView:retire:248500:store:0 -O3PipeView:fetch:234500:0x0001020c:0:97:addi a2, a2, 4:IntAlu +O3PipeView:issue:236500 +O3PipeView:complete:237000 +O3PipeView:retire:251500:store:0 +O3PipeView:fetch:234500:0x0001020c:0:98:addi a1, a1, 4:IntAlu O3PipeView:decode:235000 O3PipeView:rename:235500 O3PipeView:dispatch:236500 -O3PipeView:issue:245000 -O3PipeView:complete:245500 -O3PipeView:retire:248500:store:0 -O3PipeView:fetch:234500:0x00010210:0:98:addi a0, a0, 4:IntAlu +O3PipeView:issue:236500 +O3PipeView:complete:237000 +O3PipeView:retire:251500:store:0 +O3PipeView:fetch:234500:0x00010210:0:99:addi a3, a3, -1:IntAlu O3PipeView:decode:235000 O3PipeView:rename:235500 O3PipeView:dispatch:236500 -O3PipeView:issue:240500 -O3PipeView:complete:241000 -O3PipeView:retire:248500:store:0 -O3PipeView:fetch:234500:0x00010214:0:99:addi a1, a1, 4:IntAlu +O3PipeView:issue:236500 +O3PipeView:complete:237000 +O3PipeView:retire:251500:store:0 +O3PipeView:fetch:234500:0x00010214:0:100:bne a3, zero, -48:IntAlu O3PipeView:decode:235000 O3PipeView:rename:235500 O3PipeView:dispatch:236500 -O3PipeView:issue:244500 -O3PipeView:complete:245000 -O3PipeView:retire:248500:store:0 -O3PipeView:fetch:234500:0x00010218:0:100:addi a3, a3, -1:IntAlu +O3PipeView:issue:237000 +O3PipeView:complete:237500 +O3PipeView:retire:251500:store:0 +O3PipeView:fetch:234500:0x00010218:0:101:auipc a0, 1:IntAlu O3PipeView:decode:235000 O3PipeView:rename:235500 O3PipeView:dispatch:236500 O3PipeView:issue:236500 O3PipeView:complete:237000 -O3PipeView:retire:248500:store:0 -O3PipeView:fetch:234500:0x0001021c:0:101:bne a3, zero, -48:IntAlu +O3PipeView:retire:0:store:0 +O3PipeView:fetch:234500:0x0001021c:0:102:ld a0, 344(a0):MemRead O3PipeView:decode:235000 O3PipeView:rename:235500 O3PipeView:dispatch:236500 O3PipeView:issue:237000 O3PipeView:complete:237500 -O3PipeView:retire:248500:store:0 -O3PipeView:fetch:235000:0x00010220:0:102:auipc a0, 1:IntAlu +O3PipeView:retire:0:store:0 +O3PipeView:fetch:235000:0x00010220:0:103:auipc a1, 1:IntAlu O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 O3PipeView:issue:237000 O3PipeView:complete:237500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x00010224:0:103:ld a0, 352(a0):MemRead +O3PipeView:fetch:235000:0x00010224:0:104:ld a1, 344(a1):MemRead O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 O3PipeView:issue:237500 O3PipeView:complete:238000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x00010228:0:104:auipc a1, 1:IntAlu +O3PipeView:fetch:235000:0x00010228:0:105:auipc a2, 1:IntAlu O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 O3PipeView:issue:237000 O3PipeView:complete:237500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x0001022c:0:105:ld a1, 352(a1):MemRead +O3PipeView:fetch:235000:0x0001022c:0:106:ld a2, 344(a2):MemRead O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 O3PipeView:issue:237500 O3PipeView:complete:238000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x00010230:0:106:auipc a2, 1:IntAlu +O3PipeView:fetch:235000:0x00010230:0:107:addi a3, zero, 2:IntAlu O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 O3PipeView:issue:237000 O3PipeView:complete:237500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x00010234:0:107:ld a2, 352(a2):MemRead +O3PipeView:fetch:235000:0x00010234:0:108:flw ft0, 0(a0):FloatMemRead O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 -O3PipeView:issue:237500 -O3PipeView:complete:238000 +O3PipeView:issue:0 +O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x00010238:0:108:addi a3, zero, 2:IntAlu +O3PipeView:fetch:235000:0x00010238:0:109:flw ft1, 0(a1):FloatMemRead O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 -O3PipeView:issue:237000 -O3PipeView:complete:237500 +O3PipeView:issue:0 +O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:235000:0x0001023c:0:109:flw ft0, 0(a0):FloatMemRead +O3PipeView:fetch:235000:0x0001023c:0:110:fmul_s ft2, ft0, ft1:FloatMult O3PipeView:decode:235500 O3PipeView:rename:236000 O3PipeView:dispatch:237000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:240000:0x000101ec:0:110:flw ft0, 0(a0):FloatMemRead +O3PipeView:fetch:240000:0x000101e4:0:111:flw ft0, 0(a0):FloatMemRead O3PipeView:decode:240500 O3PipeView:rename:241000 O3PipeView:dispatch:242000 O3PipeView:issue:242000 O3PipeView:complete:242500 -O3PipeView:retire:249000:store:0 -O3PipeView:fetch:240000:0x000101f0:0:111:flw ft1, 0(a1):FloatMemRead +O3PipeView:retire:252000:store:0 +O3PipeView:fetch:240000:0x000101e8:0:112:flw ft1, 0(a1):FloatMemRead O3PipeView:decode:240500 O3PipeView:rename:241000 O3PipeView:dispatch:242000 -O3PipeView:issue:245000 -O3PipeView:complete:245500 -O3PipeView:retire:249000:store:0 -O3PipeView:fetch:241000:0x00010204:0:116:addi a2, a2, 4:IntAlu -O3PipeView:decode:241500 -O3PipeView:rename:242000 -O3PipeView:dispatch:243000 -O3PipeView:issue:245500 -O3PipeView:complete:246000 -O3PipeView:retire:249000:store:0 -O3PipeView:fetch:189500:0x000101f4:0:91:fadd_s ft2, ft0, ft1:FloatAdd +O3PipeView:issue:242000 +O3PipeView:complete:242500 +O3PipeView:retire:252000:store:0 +O3PipeView:fetch:240000:0x000101fc:0:117:addi a2, a2, 4:IntAlu +O3PipeView:decode:240500 +O3PipeView:rename:241000 +O3PipeView:dispatch:242000 +O3PipeView:issue:242000 +O3PipeView:complete:242500 +O3PipeView:retire:252000:store:0 +O3PipeView:fetch:189500:0x000101ec:0:90:fadd_s ft2, ft0, ft1:FloatAdd O3PipeView:decode:190000 O3PipeView:rename:190500 O3PipeView:dispatch:191500 -O3PipeView:issue:246000 -O3PipeView:complete:247000 -O3PipeView:retire:248000:store:0 -O3PipeView:fetch:189500:0x000101f8:0:92:fsub_s ft3, ft0, ft1:FloatAdd +O3PipeView:issue:249000 +O3PipeView:complete:250000 +O3PipeView:retire:251000:store:0 +O3PipeView:fetch:189500:0x000101f0:0:91:fsub_s ft3, ft0, ft1:FloatAdd O3PipeView:decode:190000 O3PipeView:rename:190500 O3PipeView:dispatch:191500 -O3PipeView:issue:246000 -O3PipeView:complete:247000 -O3PipeView:retire:248000:store:0 -O3PipeView:fetch:189500:0x000101fc:0:93:feq_s a4, ft0, ft1:FloatCmp +O3PipeView:issue:249000 +O3PipeView:complete:250000 +O3PipeView:retire:251000:store:0 +O3PipeView:fetch:189500:0x000101f4:0:92:feq_s a4, ft0, ft1:FloatCmp O3PipeView:decode:190000 O3PipeView:rename:190500 O3PipeView:dispatch:191500 -O3PipeView:issue:246000 -O3PipeView:complete:247000 -O3PipeView:retire:248000:store:0 -O3PipeView:fetch:241000:0x0001020c:0:118:addi a2, a2, 4:IntAlu +O3PipeView:issue:249000 +O3PipeView:complete:250000 +O3PipeView:retire:251000:store:0 +O3PipeView:fetch:241000:0x00010204:0:119:addi a2, a2, 4:IntAlu O3PipeView:decode:241500 O3PipeView:rename:242000 O3PipeView:dispatch:243000 -O3PipeView:issue:246000 -O3PipeView:complete:246500 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241000:0x00010210:0:119:addi a0, a0, 4:IntAlu +O3PipeView:issue:243000 +O3PipeView:complete:243500 +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241000:0x00010208:0:120:addi a0, a0, 4:IntAlu O3PipeView:decode:241500 O3PipeView:rename:242000 O3PipeView:dispatch:243000 O3PipeView:issue:243000 O3PipeView:complete:243500 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241000:0x00010214:0:120:addi a1, a1, 4:IntAlu +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241000:0x0001020c:0:121:addi a1, a1, 4:IntAlu O3PipeView:decode:241500 O3PipeView:rename:242000 O3PipeView:dispatch:243000 -O3PipeView:issue:245000 -O3PipeView:complete:245500 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241000:0x00010218:0:121:addi a3, a3, -1:IntAlu +O3PipeView:issue:243000 +O3PipeView:complete:243500 +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241000:0x00010210:0:122:addi a3, a3, -1:IntAlu O3PipeView:decode:241500 O3PipeView:rename:242000 O3PipeView:dispatch:243000 O3PipeView:issue:243000 O3PipeView:complete:243500 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241000:0x0001021c:0:122:bne a3, zero, -48:IntAlu +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241000:0x00010214:0:123:bne a3, zero, -48:IntAlu O3PipeView:decode:241500 O3PipeView:rename:242000 O3PipeView:dispatch:243000 O3PipeView:issue:243500 O3PipeView:complete:244000 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241500:0x00010220:0:123:auipc a0, 1:IntAlu -O3PipeView:decode:242000 -O3PipeView:rename:242500 -O3PipeView:dispatch:243500 +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241000:0x00010218:0:124:auipc a0, 1:IntAlu +O3PipeView:decode:241500 +O3PipeView:rename:242000 +O3PipeView:dispatch:243000 +O3PipeView:issue:243000 +O3PipeView:complete:243500 +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241000:0x0001021c:0:125:ld a0, 344(a0):MemRead +O3PipeView:decode:241500 +O3PipeView:rename:242000 +O3PipeView:dispatch:243000 O3PipeView:issue:243500 O3PipeView:complete:244000 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241500:0x00010224:0:124:ld a0, 352(a0):MemRead -O3PipeView:decode:242000 -O3PipeView:rename:242500 -O3PipeView:dispatch:243500 -O3PipeView:issue:244000 -O3PipeView:complete:244500 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:241500:0x00010228:0:125:auipc a1, 1:IntAlu +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:241500:0x00010220:0:126:auipc a1, 1:IntAlu O3PipeView:decode:242000 O3PipeView:rename:242500 O3PipeView:dispatch:243500 O3PipeView:issue:243500 O3PipeView:complete:244000 -O3PipeView:retire:249500:store:0 -O3PipeView:fetch:240000:0x000101f4:0:112:fadd_s ft2, ft0, ft1:FloatAdd +O3PipeView:retire:252500:store:0 +O3PipeView:fetch:240000:0x000101ec:0:113:fadd_s ft2, ft0, ft1:FloatAdd O3PipeView:decode:240500 O3PipeView:rename:241000 O3PipeView:dispatch:242000 -O3PipeView:issue:246500 -O3PipeView:complete:247500 -O3PipeView:retire:249000:store:0 -O3PipeView:fetch:240000:0x000101f8:0:113:fsub_s ft3, ft0, ft1:FloatAdd +O3PipeView:issue:249500 +O3PipeView:complete:250500 +O3PipeView:retire:252000:store:0 +O3PipeView:fetch:240000:0x000101f0:0:114:fsub_s ft3, ft0, ft1:FloatAdd O3PipeView:decode:240500 O3PipeView:rename:241000 O3PipeView:dispatch:242000 -O3PipeView:issue:246500 -O3PipeView:complete:247500 -O3PipeView:retire:249000:store:0 -O3PipeView:fetch:240000:0x000101fc:0:114:feq_s a4, ft0, ft1:FloatCmp +O3PipeView:issue:249500 +O3PipeView:complete:250500 +O3PipeView:retire:252000:store:0 +O3PipeView:fetch:240000:0x000101f4:0:115:feq_s a4, ft0, ft1:FloatCmp O3PipeView:decode:240500 O3PipeView:rename:241000 O3PipeView:dispatch:242000 -O3PipeView:issue:246500 -O3PipeView:complete:247500 -O3PipeView:retire:249000:store:0 -O3PipeView:fetch:241500:0x0001022c:0:126:ld a1, 352(a1):MemRead +O3PipeView:issue:249500 +O3PipeView:complete:250500 +O3PipeView:retire:252000:store:0 +O3PipeView:fetch:189500:0x000101f8:0:93:fsw ft2, 0(a2):FloatMemWrite +O3PipeView:decode:190000 +O3PipeView:rename:190500 +O3PipeView:dispatch:191500 +O3PipeView:issue:250000 +O3PipeView:complete:250500 +O3PipeView:retire:251500:store:253500 +O3PipeView:fetch:241500:0x00010224:0:127:ld a1, 344(a1):MemRead O3PipeView:decode:242000 O3PipeView:rename:242500 O3PipeView:dispatch:243500 O3PipeView:issue:244000 O3PipeView:complete:244500 -O3PipeView:retire:250000:store:0 -O3PipeView:fetch:241500:0x00010230:0:127:auipc a2, 1:IntAlu +O3PipeView:retire:253000:store:0 +O3PipeView:fetch:241500:0x00010228:0:128:auipc a2, 1:IntAlu O3PipeView:decode:242000 O3PipeView:rename:242500 O3PipeView:dispatch:243500 O3PipeView:issue:243500 O3PipeView:complete:244000 -O3PipeView:retire:250000:store:0 -O3PipeView:fetch:241500:0x00010234:0:128:ld a2, 352(a2):MemRead +O3PipeView:retire:253000:store:0 +O3PipeView:fetch:241500:0x0001022c:0:129:ld a2, 344(a2):MemRead O3PipeView:decode:242000 O3PipeView:rename:242500 O3PipeView:dispatch:243500 O3PipeView:issue:244000 O3PipeView:complete:244500 -O3PipeView:retire:250000:store:0 -O3PipeView:fetch:241500:0x00010238:0:129:addi a3, zero, 2:IntAlu +O3PipeView:retire:253000:store:0 +O3PipeView:fetch:241500:0x00010230:0:130:addi a3, zero, 2:IntAlu O3PipeView:decode:242000 O3PipeView:rename:242500 O3PipeView:dispatch:243500 O3PipeView:issue:243500 O3PipeView:complete:244000 -O3PipeView:retire:250000:store:0 -O3PipeView:fetch:241500:0x0001023c:0:130:flw ft0, 0(a0):FloatMemRead +O3PipeView:retire:253000:store:0 +O3PipeView:fetch:241500:0x00010234:0:131:flw ft0, 0(a0):FloatMemRead O3PipeView:decode:242000 O3PipeView:rename:242500 O3PipeView:dispatch:243500 O3PipeView:issue:245500 O3PipeView:complete:246000 -O3PipeView:retire:250000:store:0 -O3PipeView:fetch:286500:0x00010240:0:131:flw ft1, 0(a1):FloatMemRead -O3PipeView:decode:287000 -O3PipeView:rename:287500 -O3PipeView:dispatch:288500 -O3PipeView:issue:288500 -O3PipeView:complete:289000 -O3PipeView:retire:291000:store:0 -O3PipeView:fetch:286500:0x00010244:0:132:fmul_s ft2, ft0, ft1:FloatMult -O3PipeView:decode:287000 -O3PipeView:rename:287500 -O3PipeView:dispatch:288500 -O3PipeView:issue:290000 -O3PipeView:complete:292000 -O3PipeView:retire:293000:store:0 -O3PipeView:fetch:286500:0x00010250:0:135:addi a2, a2, 4:IntAlu +O3PipeView:retire:253000:store:0 +O3PipeView:fetch:241500:0x00010238:0:132:flw ft1, 0(a1):FloatMemRead +O3PipeView:decode:242000 +O3PipeView:rename:242500 +O3PipeView:dispatch:243500 +O3PipeView:issue:245500 +O3PipeView:complete:246000 +O3PipeView:retire:253000:store:0 +O3PipeView:fetch:234500:0x00010200:0:95:fsw ft3, 0(a2):FloatMemWrite +O3PipeView:decode:235000 +O3PipeView:rename:235500 +O3PipeView:dispatch:236500 +O3PipeView:issue:250000 +O3PipeView:complete:250500 +O3PipeView:retire:251500:store:253501 +O3PipeView:fetch:240000:0x000101f8:0:116:fsw ft2, 0(a2):FloatMemWrite +O3PipeView:decode:240500 +O3PipeView:rename:241000 +O3PipeView:dispatch:242000 +O3PipeView:issue:250500 +O3PipeView:complete:251000 +O3PipeView:retire:252000:store:254000 +O3PipeView:fetch:241000:0x00010200:0:118:fsw ft3, 0(a2):FloatMemWrite +O3PipeView:decode:241500 +O3PipeView:rename:242000 +O3PipeView:dispatch:243000 +O3PipeView:issue:250500 +O3PipeView:complete:251000 +O3PipeView:retire:252000:store:254001 +O3PipeView:fetch:241500:0x0001023c:0:133:fmul_s ft2, ft0, ft1:FloatMult +O3PipeView:decode:242000 +O3PipeView:rename:242500 +O3PipeView:dispatch:243500 +O3PipeView:issue:250500 +O3PipeView:complete:252500 +O3PipeView:retire:253500:store:0 +O3PipeView:fetch:286500:0x00010248:0:136:addi a2, a2, 4:IntAlu O3PipeView:decode:287000 O3PipeView:rename:287500 O3PipeView:dispatch:288500 O3PipeView:issue:288500 O3PipeView:complete:289000 -O3PipeView:retire:297000:store:0 -O3PipeView:fetch:287000:0x0001026c:0:142:auipc a0, 1:IntAlu +O3PipeView:retire:295500:store:0 +O3PipeView:fetch:287000:0x00010264:0:143:auipc a0, 1:IntAlu O3PipeView:decode:287500 O3PipeView:rename:288000 O3PipeView:dispatch:289000 O3PipeView:issue:289000 O3PipeView:complete:289500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:287000:0x00010270:0:143:ld a0, 300(a0):MemRead +O3PipeView:fetch:287000:0x00010268:0:144:ld a0, 292(a0):MemRead O3PipeView:decode:287500 O3PipeView:rename:288000 O3PipeView:dispatch:289000 O3PipeView:issue:289500 O3PipeView:complete:290000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:287000:0x00010274:0:144:auipc a1, 1:IntAlu +O3PipeView:fetch:287000:0x0001026c:0:145:auipc a1, 1:IntAlu O3PipeView:decode:287500 O3PipeView:rename:288000 O3PipeView:dispatch:289000 O3PipeView:issue:289000 O3PipeView:complete:289500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:287000:0x00010278:0:145:ld a1, 300(a1):MemRead +O3PipeView:fetch:287000:0x00010270:0:146:ld a1, 292(a1):MemRead O3PipeView:decode:287500 O3PipeView:rename:288000 O3PipeView:dispatch:289000 O3PipeView:issue:289500 O3PipeView:complete:290000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:287000:0x0001027c:0:146:auipc a2, 1:IntAlu +O3PipeView:fetch:287000:0x00010274:0:147:auipc a2, 1:IntAlu O3PipeView:decode:287500 O3PipeView:rename:288000 O3PipeView:dispatch:289000 O3PipeView:issue:289000 O3PipeView:complete:289500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:286500:0x00010258:0:137:addi a2, a2, 4:IntAlu +O3PipeView:fetch:287000:0x00010278:0:148:ld a2, 292(a2):MemRead +O3PipeView:decode:287500 +O3PipeView:rename:288000 +O3PipeView:dispatch:289000 +O3PipeView:issue:289500 +O3PipeView:complete:290000 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:287000:0x0001027c:0:149:addi t0, zero, 4:IntAlu +O3PipeView:decode:287500 +O3PipeView:rename:288000 +O3PipeView:dispatch:289000 +O3PipeView:issue:289000 +O3PipeView:complete:289500 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:286500:0x00010250:0:138:addi a2, a2, 4:IntAlu O3PipeView:decode:287000 O3PipeView:rename:287500 O3PipeView:dispatch:288500 O3PipeView:issue:289000 O3PipeView:complete:289500 -O3PipeView:retire:297500:store:0 -O3PipeView:fetch:286500:0x0001025c:0:138:addi a0, a0, 4:IntAlu +O3PipeView:retire:296000:store:0 +O3PipeView:fetch:286500:0x00010254:0:139:addi a0, a0, 4:IntAlu O3PipeView:decode:287000 O3PipeView:rename:287500 O3PipeView:dispatch:288500 O3PipeView:issue:288500 O3PipeView:complete:289000 -O3PipeView:retire:297500:store:0 -O3PipeView:fetch:287000:0x00010260:0:139:addi a1, a1, 4:IntAlu -O3PipeView:decode:287500 -O3PipeView:rename:288000 -O3PipeView:dispatch:289000 -O3PipeView:issue:289000 -O3PipeView:complete:289500 -O3PipeView:retire:297500:store:0 -O3PipeView:fetch:287000:0x00010264:0:140:addi a3, a3, -1:IntAlu +O3PipeView:retire:296000:store:0 +O3PipeView:fetch:286500:0x00010258:0:140:addi a1, a1, 4:IntAlu +O3PipeView:decode:287000 +O3PipeView:rename:287500 +O3PipeView:dispatch:288500 +O3PipeView:issue:288500 +O3PipeView:complete:289000 +O3PipeView:retire:296000:store:0 +O3PipeView:fetch:286500:0x0001025c:0:141:addi a3, a3, -1:IntAlu +O3PipeView:decode:287000 +O3PipeView:rename:287500 +O3PipeView:dispatch:288500 +O3PipeView:issue:288500 +O3PipeView:complete:289000 +O3PipeView:retire:296000:store:0 +O3PipeView:fetch:287000:0x00010260:0:142:bne a3, zero, -44:IntAlu O3PipeView:decode:287500 O3PipeView:rename:288000 O3PipeView:dispatch:289000 O3PipeView:issue:289000 O3PipeView:complete:289500 -O3PipeView:retire:297500:store:0 -O3PipeView:fetch:287000:0x00010268:0:141:bne a3, zero, -44:IntAlu -O3PipeView:decode:287500 -O3PipeView:rename:288000 -O3PipeView:dispatch:289000 -O3PipeView:issue:289500 -O3PipeView:complete:290000 -O3PipeView:retire:297500:store:0 -O3PipeView:fetch:286500:0x00010248:0:133:fdiv_s ft3, ft0, ft1:FloatDiv +O3PipeView:retire:296000:store:0 +O3PipeView:fetch:286500:0x00010240:0:134:fdiv_s ft3, ft0, ft1:FloatDiv +O3PipeView:decode:287000 +O3PipeView:rename:287500 +O3PipeView:dispatch:288500 +O3PipeView:issue:288500 +O3PipeView:complete:294500 +O3PipeView:retire:295500:store:0 +O3PipeView:fetch:286500:0x00010244:0:135:fsw ft2, 0(a2):FloatMemWrite +O3PipeView:decode:287000 +O3PipeView:rename:287500 +O3PipeView:dispatch:288500 +O3PipeView:issue:288500 +O3PipeView:complete:289000 +O3PipeView:retire:295500:store:297503 +O3PipeView:fetch:286500:0x0001024c:0:137:fsw ft3, 0(a2):FloatMemWrite O3PipeView:decode:287000 O3PipeView:rename:287500 O3PipeView:dispatch:288500 -O3PipeView:issue:290000 -O3PipeView:complete:296000 -O3PipeView:retire:297000:store:0 -O3PipeView:fetch:292500:0x0001023c:0:147:flw ft0, 0(a0):FloatMemRead -O3PipeView:decode:293000 -O3PipeView:rename:293500 -O3PipeView:dispatch:294500 O3PipeView:issue:294500 O3PipeView:complete:295000 -O3PipeView:retire:297500:store:0 -O3PipeView:fetch:293500:0x00010240:0:148:flw ft1, 0(a1):FloatMemRead -O3PipeView:decode:294000 -O3PipeView:rename:294500 -O3PipeView:dispatch:295500 +O3PipeView:retire:296000:store:298000 +O3PipeView:fetch:292000:0x00010234:0:150:flw ft0, 0(a0):FloatMemRead +O3PipeView:decode:292500 +O3PipeView:rename:293000 +O3PipeView:dispatch:294000 +O3PipeView:issue:294000 +O3PipeView:complete:294500 +O3PipeView:retire:296500:store:0 +O3PipeView:fetch:292000:0x00010238:0:151:flw ft1, 0(a1):FloatMemRead +O3PipeView:decode:292500 +O3PipeView:rename:293000 +O3PipeView:dispatch:294000 +O3PipeView:issue:294000 +O3PipeView:complete:294500 +O3PipeView:retire:297000:store:0 +O3PipeView:fetch:292000:0x0001023c:0:152:fmul_s ft2, ft0, ft1:FloatMult +O3PipeView:decode:292500 +O3PipeView:rename:293000 +O3PipeView:dispatch:294000 +O3PipeView:issue:296000 +O3PipeView:complete:298000 +O3PipeView:retire:299000:store:0 +O3PipeView:fetch:293000:0x00010248:0:155:addi a2, a2, 4:IntAlu +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:295000 +O3PipeView:complete:295500 +O3PipeView:retire:303000:store:0 +O3PipeView:fetch:293000:0x00010250:0:157:addi a2, a2, 4:IntAlu +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 O3PipeView:issue:295500 O3PipeView:complete:296000 -O3PipeView:retire:298000:store:0 -O3PipeView:fetch:234500:0x00010200:0:94:fsw ft2, 0(a2):FloatMemWrite -O3PipeView:decode:235000 -O3PipeView:rename:235500 -O3PipeView:dispatch:236500 -O3PipeView:issue:247000 -O3PipeView:complete:247500 -O3PipeView:retire:248500:store:301000 -O3PipeView:fetch:293500:0x00010244:0:149:fmul_s ft2, ft0, ft1:FloatMult +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293000:0x00010254:0:158:addi a0, a0, 4:IntAlu +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:295000 +O3PipeView:complete:295500 +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293000:0x00010258:0:159:addi a1, a1, 4:IntAlu +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:295000 +O3PipeView:complete:295500 +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293000:0x0001025c:0:160:addi a3, a3, -1:IntAlu +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:295000 +O3PipeView:complete:295500 +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293500:0x00010260:0:161:bne a3, zero, -44:IntAlu O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 -O3PipeView:issue:297000 -O3PipeView:complete:299000 -O3PipeView:retire:300000:store:0 -O3PipeView:fetch:293500:0x00010250:0:152:addi a2, a2, 4:IntAlu +O3PipeView:issue:295500 +O3PipeView:complete:296000 +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293500:0x00010264:0:162:auipc a0, 1:IntAlu O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 O3PipeView:issue:295500 O3PipeView:complete:296000 -O3PipeView:retire:304000:store:0 -O3PipeView:fetch:234500:0x00010208:0:96:fsw ft3, 0(a2):FloatMemWrite -O3PipeView:decode:235000 -O3PipeView:rename:235500 -O3PipeView:dispatch:236500 -O3PipeView:issue:247000 -O3PipeView:complete:247500 -O3PipeView:retire:248500:store:305000 -O3PipeView:fetch:293500:0x00010258:0:154:addi a2, a2, 4:IntAlu +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293500:0x00010268:0:163:ld a0, 292(a0):MemRead O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 O3PipeView:issue:296000 O3PipeView:complete:296500 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:293500:0x0001025c:0:155:addi a0, a0, 4:IntAlu +O3PipeView:retire:303500:store:0 +O3PipeView:fetch:293500:0x0001026c:0:164:auipc a1, 1:IntAlu O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 O3PipeView:issue:295500 O3PipeView:complete:296000 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:294000:0x00010260:0:156:addi a1, a1, 4:IntAlu -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296000 -O3PipeView:complete:296500 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:294000:0x00010264:0:157:addi a3, a3, -1:IntAlu -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296000 -O3PipeView:complete:296500 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:294000:0x00010268:0:158:bne a3, zero, -44:IntAlu -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296500 -O3PipeView:complete:297000 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:294000:0x0001026c:0:159:auipc a0, 1:IntAlu -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296000 -O3PipeView:complete:296500 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:294000:0x00010270:0:160:ld a0, 300(a0):MemRead -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296500 -O3PipeView:complete:297000 -O3PipeView:retire:304500:store:0 -O3PipeView:fetch:241000:0x00010200:0:115:fsw ft2, 0(a2):FloatMemWrite -O3PipeView:decode:241500 -O3PipeView:rename:242000 -O3PipeView:dispatch:243000 -O3PipeView:issue:247500 -O3PipeView:complete:248000 -O3PipeView:retire:249000:store:305001 -O3PipeView:fetch:286500:0x0001024c:0:134:fsw ft2, 0(a2):FloatMemWrite -O3PipeView:decode:287000 -O3PipeView:rename:287500 -O3PipeView:dispatch:288500 -O3PipeView:issue:292000 -O3PipeView:complete:292500 -O3PipeView:retire:297000:store:301001 -O3PipeView:fetch:241000:0x00010208:0:117:fsw ft3, 0(a2):FloatMemWrite -O3PipeView:decode:241500 -O3PipeView:rename:242000 -O3PipeView:dispatch:243000 -O3PipeView:issue:247500 -O3PipeView:complete:248000 -O3PipeView:retire:249000:store:305002 -O3PipeView:fetch:286500:0x00010254:0:136:fsw ft3, 0(a2):FloatMemWrite -O3PipeView:decode:287000 -O3PipeView:rename:287500 -O3PipeView:dispatch:288500 -O3PipeView:issue:296000 -O3PipeView:complete:296500 -O3PipeView:retire:297500:store:305003 -O3PipeView:fetch:294000:0x00010274:0:161:auipc a1, 1:IntAlu -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296000 -O3PipeView:complete:296500 -O3PipeView:retire:305000:store:0 -O3PipeView:fetch:294000:0x00010278:0:162:ld a1, 300(a1):MemRead -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 -O3PipeView:issue:296500 -O3PipeView:complete:297000 -O3PipeView:retire:305000:store:0 -O3PipeView:fetch:294000:0x0001027c:0:163:auipc a2, 1:IntAlu -O3PipeView:decode:294500 -O3PipeView:rename:295000 -O3PipeView:dispatch:296000 +O3PipeView:retire:304000:store:0 +O3PipeView:fetch:293500:0x00010270:0:165:ld a1, 292(a1):MemRead +O3PipeView:decode:294000 +O3PipeView:rename:294500 +O3PipeView:dispatch:295500 O3PipeView:issue:296000 O3PipeView:complete:296500 -O3PipeView:retire:305000:store:0 -O3PipeView:fetch:293500:0x00010248:0:150:fdiv_s ft3, ft0, ft1:FloatDiv +O3PipeView:retire:304000:store:0 +O3PipeView:fetch:293500:0x00010274:0:166:auipc a2, 1:IntAlu O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 -O3PipeView:issue:297000 -O3PipeView:complete:303000 +O3PipeView:issue:295500 +O3PipeView:complete:296000 O3PipeView:retire:304000:store:0 -O3PipeView:fetch:293500:0x0001024c:0:151:fsw ft2, 0(a2):FloatMemWrite +O3PipeView:fetch:293500:0x00010278:0:167:ld a2, 292(a2):MemRead O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 -O3PipeView:issue:299000 -O3PipeView:complete:299500 -O3PipeView:retire:304000:store:306000 -O3PipeView:fetch:293500:0x00010254:0:153:fsw ft3, 0(a2):FloatMemWrite +O3PipeView:issue:296000 +O3PipeView:complete:296500 +O3PipeView:retire:304000:store:0 +O3PipeView:fetch:293500:0x0001027c:0:168:addi t0, zero, 4:IntAlu O3PipeView:decode:294000 O3PipeView:rename:294500 O3PipeView:dispatch:295500 -O3PipeView:issue:303000 -O3PipeView:complete:303500 -O3PipeView:retire:304500:store:306500 -O3PipeView:fetch:339500:0x000102be:0:182:c_addi4spn s0, sp, 0:IntAlu -O3PipeView:decode:340000 -O3PipeView:rename:340500 +O3PipeView:issue:295500 +O3PipeView:complete:296000 +O3PipeView:retire:304000:store:0 +O3PipeView:fetch:293000:0x00010240:0:153:fdiv_s ft3, ft0, ft1:FloatDiv +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:296000 +O3PipeView:complete:302000 +O3PipeView:retire:303000:store:0 +O3PipeView:fetch:293000:0x00010244:0:154:fsw ft2, 0(a2):FloatMemWrite +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:298000 +O3PipeView:complete:298500 +O3PipeView:retire:303000:store:305000 +O3PipeView:fetch:293000:0x0001024c:0:156:fsw ft3, 0(a2):FloatMemWrite +O3PipeView:decode:293500 +O3PipeView:rename:294000 +O3PipeView:dispatch:295000 +O3PipeView:issue:302000 +O3PipeView:complete:302500 +O3PipeView:retire:303500:store:305500 +O3PipeView:fetch:339000:0x000102b4:0:184:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:339500 +O3PipeView:rename:340000 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339500:0x000102bc:0:181:c_addi4spn s0, sp, 0:IntAlu -O3PipeView:decode:340000 -O3PipeView:rename:340500 +O3PipeView:fetch:339000:0x000102b2:0:183:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:339500 +O3PipeView:rename:340000 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339500:0x000102ba:0:180:c_addi4spn s0, sp, 0:IntAlu -O3PipeView:decode:340000 -O3PipeView:rename:340500 +O3PipeView:fetch:339000:0x000102b0:0:182:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:339500 +O3PipeView:rename:340000 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102b8:0:179:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:fetch:339000:0x000102ae:0:181:c_addi4spn s0, sp, 0:IntAlu O3PipeView:decode:339500 O3PipeView:rename:340000 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102b6:0:178:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:fetch:339000:0x000102ac:0:180:c_addi4spn s0, sp, 0:IntAlu O3PipeView:decode:339500 O3PipeView:rename:340000 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102b4:0:177:c_addi4spn s0, sp, 0:IntAlu -O3PipeView:decode:339500 -O3PipeView:rename:340000 +O3PipeView:fetch:339500:0x000102be:0:189:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:340000 +O3PipeView:rename:340500 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102a0:0:172:addi a2, a2, 32:IntAlu -O3PipeView:decode:339500 -O3PipeView:rename:340000 -O3PipeView:dispatch:341000 -O3PipeView:issue:342000 +O3PipeView:fetch:339500:0x000102bc:0:188:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:340000 +O3PipeView:rename:340500 +O3PipeView:dispatch:0 +O3PipeView:issue:0 +O3PipeView:complete:0 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:339500:0x000102ba:0:187:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:340000 +O3PipeView:rename:340500 +O3PipeView:dispatch:0 +O3PipeView:issue:0 +O3PipeView:complete:0 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:339500:0x000102b8:0:186:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:340000 +O3PipeView:rename:340500 +O3PipeView:dispatch:0 +O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102b0:0:176:ecall:No_OpClass +O3PipeView:fetch:339500:0x000102b6:0:185:c_addi4spn s0, sp, 0:IntAlu +O3PipeView:decode:340000 +O3PipeView:rename:340500 +O3PipeView:dispatch:0 +O3PipeView:issue:0 +O3PipeView:complete:0 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:339000:0x000102a8:0:179:ecall:No_OpClass O3PipeView:decode:339500 O3PipeView:rename:340000 O3PipeView:dispatch:341000 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x0001029c:0:171:vnop:No_OpClass +O3PipeView:fetch:338500:0x0001029c:0:176:vnop:No_OpClass O3PipeView:decode:339000 O3PipeView:rename:339500 O3PipeView:dispatch:340500 O3PipeView:issue:340500 O3PipeView:complete:341000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x00010298:0:170:vnop:No_OpClass +O3PipeView:fetch:338500:0x00010298:0:175:addi a2, a2, 32:IntAlu O3PipeView:decode:339000 O3PipeView:rename:339500 O3PipeView:dispatch:340500 O3PipeView:issue:340500 O3PipeView:complete:341000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x00010294:0:169:vnop:No_OpClass +O3PipeView:fetch:338500:0x00010294:0:174:vnop:No_OpClass O3PipeView:decode:339000 O3PipeView:rename:339500 O3PipeView:dispatch:340500 O3PipeView:issue:340500 O3PipeView:complete:341000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x00010290:0:168:vnop:No_OpClass +O3PipeView:fetch:338500:0x00010290:0:173:vnop:No_OpClass O3PipeView:decode:339000 O3PipeView:rename:339500 O3PipeView:dispatch:340500 O3PipeView:issue:340500 O3PipeView:complete:341000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x0001028c:0:167:vnop:No_OpClass +O3PipeView:fetch:338500:0x0001028c:0:172:vnop:No_OpClass O3PipeView:decode:339000 O3PipeView:rename:339500 O3PipeView:dispatch:340500 O3PipeView:issue:340500 O3PipeView:complete:341000 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x00010284:0:165:addi t0, zero, 4:IntAlu +O3PipeView:fetch:338500:0x00010288:0:171:vnop:No_OpClass +O3PipeView:decode:339000 +O3PipeView:rename:339500 +O3PipeView:dispatch:340500 +O3PipeView:issue:340500 +O3PipeView:complete:341000 +O3PipeView:retire:0:store:0 +O3PipeView:fetch:338500:0x00010284:0:170:vnop:No_OpClass O3PipeView:decode:339000 O3PipeView:rename:339500 O3PipeView:dispatch:340500 O3PipeView:issue:340500 O3PipeView:complete:341000 -O3PipeView:retire:343000:store:0 -O3PipeView:fetch:339000:0x000102ac:0:175:addi a7, zero, 93:IntAlu -O3PipeView:decode:339500 -O3PipeView:rename:340000 -O3PipeView:dispatch:341000 -O3PipeView:issue:341000 -O3PipeView:complete:341500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102a8:0:174:addi a0, zero, 0:IntAlu +O3PipeView:fetch:338500:0x00010280:0:169:vsetvli t0, t0, e32, m1, ta, ma:SimdConfig +O3PipeView:decode:339000 +O3PipeView:rename:339500 +O3PipeView:dispatch:340500 +O3PipeView:issue:340500 +O3PipeView:complete:341000 +O3PipeView:retire:342500:store:0 +O3PipeView:fetch:339000:0x000102a4:0:178:addi a7, zero, 93:IntAlu O3PipeView:decode:339500 O3PipeView:rename:340000 O3PipeView:dispatch:341000 O3PipeView:issue:341000 O3PipeView:complete:341500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:339000:0x000102a4:0:173:vnop:No_OpClass +O3PipeView:fetch:339000:0x000102a0:0:177:addi a0, zero, 0:IntAlu O3PipeView:decode:339500 O3PipeView:rename:340000 O3PipeView:dispatch:341000 O3PipeView:issue:341000 O3PipeView:complete:341500 O3PipeView:retire:0:store:0 -O3PipeView:fetch:338500:0x00010288:0:166:vsetvli t0, t0, e32, m1, ta, ma:SimdConfig -O3PipeView:decode:339000 -O3PipeView:rename:339500 -O3PipeView:dispatch:340500 -O3PipeView:issue:341000 -O3PipeView:complete:341500 -O3PipeView:retire:343000:store:0 -O3PipeView:fetch:338500:0x00010280:0:164:ld a2, 300(a2):MemRead -O3PipeView:decode:339000 -O3PipeView:rename:339500 -O3PipeView:dispatch:340500 -O3PipeView:issue:340500 -O3PipeView:complete:341000 -O3PipeView:retire:343000:store:0 -O3PipeView:fetch:344000:0x0001028c:0:183:vle32_v_micro v1, 0(a0), zero:SimdUnitStrideLoad -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:346000 -O3PipeView:complete:346500 -O3PipeView:retire:348500:store:0 -O3PipeView:fetch:344000:0x000102a0:0:188:addi a2, a2, 32:IntAlu -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:346000 -O3PipeView:complete:346500 -O3PipeView:retire:350000:store:0 -O3PipeView:fetch:344000:0x000102a8:0:190:addi a0, zero, 0:IntAlu -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:346000 -O3PipeView:complete:346500 -O3PipeView:retire:350000:store:0 -O3PipeView:fetch:344500:0x000102ac:0:191:addi a7, zero, 93:IntAlu -O3PipeView:decode:345500 -O3PipeView:rename:346000 -O3PipeView:dispatch:347000 -O3PipeView:issue:347000 -O3PipeView:complete:347500 -O3PipeView:retire:350000:store:0 -O3PipeView:fetch:344000:0x00010290:0:184:vle32_v_micro v2, 0(a1), zero:SimdUnitStrideLoad -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:346000 -O3PipeView:complete:346500 -O3PipeView:retire:349000:store:0 -O3PipeView:fetch:344000:0x00010298:0:186:vmul_vv_micro v4, v1, v2:SimdMult -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:348000 -O3PipeView:complete:348500 -O3PipeView:retire:349500:store:0 -O3PipeView:fetch:344000:0x00010294:0:185:vadd_vv_micro v3, v1, v2:SimdAdd -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:348000 -O3PipeView:complete:348500 -O3PipeView:retire:349500:store:0 -O3PipeView:fetch:344000:0x0001029c:0:187:vse32_v_micro v3, 0(a2):SimdUnitStrideStore -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:348500 -O3PipeView:complete:349000 -O3PipeView:retire:350000:store:352000 -O3PipeView:fetch:344000:0x000102a4:0:189:vse32_v_micro v4, 0(a2):SimdUnitStrideStore -O3PipeView:decode:344500 -O3PipeView:rename:345000 -O3PipeView:dispatch:346000 -O3PipeView:issue:348500 -O3PipeView:complete:349000 -O3PipeView:retire:350000:store:352001 +O3PipeView:fetch:343500:0x00010284:0:190:vle32_v_micro v1, 0(a0), zero:SimdUnitStrideLoad +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:345500 +O3PipeView:complete:346000 +O3PipeView:retire:398000:store:0 +O3PipeView:fetch:343500:0x00010298:0:195:addi a2, a2, 32:IntAlu +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:345500 +O3PipeView:complete:346000 +O3PipeView:retire:403000:store:0 +O3PipeView:fetch:343500:0x000102a0:0:197:addi a0, zero, 0:IntAlu +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:345500 +O3PipeView:complete:346000 +O3PipeView:retire:403000:store:0 +O3PipeView:fetch:344000:0x000102a4:0:198:addi a7, zero, 93:IntAlu +O3PipeView:decode:345000 +O3PipeView:rename:345500 +O3PipeView:dispatch:346500 +O3PipeView:issue:346500 +O3PipeView:complete:347000 +O3PipeView:retire:403000:store:0 +O3PipeView:fetch:343500:0x00010288:0:191:vle32_v_micro v2, 0(a1), zero:SimdUnitStrideLoad +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:345500 +O3PipeView:complete:346000 +O3PipeView:retire:402000:store:0 +O3PipeView:fetch:343500:0x00010290:0:193:vmul_vv_micro v4, v1, v2:SimdMult +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:401000 +O3PipeView:complete:401500 +O3PipeView:retire:402500:store:0 +O3PipeView:fetch:343500:0x0001028c:0:192:vadd_vv_micro v3, v1, v2:SimdAdd +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:401000 +O3PipeView:complete:401500 +O3PipeView:retire:402500:store:0 +O3PipeView:fetch:343500:0x00010294:0:194:vse32_v_micro v3, 0(a2):SimdUnitStrideStore +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:401500 +O3PipeView:complete:402000 +O3PipeView:retire:403000:store:405000 +O3PipeView:fetch:343500:0x0001029c:0:196:vse32_v_micro v4, 0(a2):SimdUnitStrideStore +O3PipeView:decode:344000 +O3PipeView:rename:344500 +O3PipeView:dispatch:345500 +O3PipeView:issue:401500 +O3PipeView:complete:402000 +O3PipeView:retire:403000:store:405001 diff --git a/examples/reference/reference_0.json.gz b/examples/reference/reference_0.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..f54119f4dca8fd749d52356337e0591136ce071c GIT binary patch literal 22504 zcmZs?WmH^E@a~H{!9BS9;10oqYjAf7?(XjH5ZocS%iu1--Q9x)Ka;%wbM8HN-7m9x zcF%NI*Y3UgS5MU@j)H>&GZ(ai_;55eGj%kzH8#};Fj+a-*@CU-=-O#ZHkVwzsKfcV z;M@D_HVJ*5(nY8A2VcvX!ykr3f`PL6Wto4!fN7eS4San}pc!Ww-K}X^)Ux|Vi_<5Z zIEVe@zOXv&dv@mcaj?JtvH6jm{d#ZZ(Dr=x!Tof0n0K~d#IyCj7d8Ch?9|=)!CYh6 z{d#Nkws!H>BzO^qT>!pNPnTx=nzVMj2c|HNaJ+n1l!~8+mzN~t zZ4Jrq~D!Ks(wv+=B`h0w@O=5YQmti%YcaS-Xz5ML=T zNkv~x-`^@*_;f9iXCzBF?3e2<7&#}d2T9g&1DGKOWiIamnQIp`+& zjq6`$mlxX+VsBpdyP4!SXY6|G7`UXjlfcKzWE@V^nl{x#4aoy;Fm8bJxd0hs)B*FO zelC0$Gn_!E!Rt#YIV}Ip`N7%T(^{ny-EBU}Ep8B;zw>bt_nq6>?PR3xaZ=!nF%lV= za(+vAUY#p{B;TPpgm$ zA^42~>^;xRP8>)fEes(o%3)^8h5SdrwAR72D!}c#dmKX|CLbRU{u>l#Mj6>(^hX@V zS9hr9c}bEWe@Q(^3|3#s$v=n!P`rOgXOxH`x}G7!i698yQIE?|z^5J`Z>~^;pmG!odX1XoPX{! zoB`_fSM1Dd{QdG;;SeGS$X8U{GL(Rbe`Z0x|NZiR%!2u6miG1)u^$}Ld>9zWVbgsx zOFvSd@l|OMJ}c)2K>lafz|OU`qKpsnuId+zt%6`daO!#LZPhn$F@;|Ecc^T|Jpb&g zs{}%;Z47%6kTL(c3)FWHuTch3;tnlajs;Nh1Dk!!+u8Dyczdr=@`Hc}OS3-=+#_n= z&VDBkM=fGNI;=r*)%!pbs|@7trW;XFhfdMNJweBo;JqCCx^yZOSO%rl38iHPpR9?u zhpslnefbM_=|m{-*rhc{KaB763}CL@7`JB7cXl28%sWvB1lPm`d+?84g&bpuwueU~ z|LkTOe0EO^eE&|AC6!RKYng8;jgqeH1$Go;@ufrpNHnA31!k^=r12SAGLVo1ouQH2 zDl;)cwmbvQ9O~{ymLwl`qD;U)83Acz9(NfE#tMUmor6;b4~p%Sge2t)F-oX1=eVQ7 zq_Mc@82S2lJ-AR$NXIm1!LmIf)G@k1rcERzN}@99iIWf?ej+(bsCAp$Z2x(3L>NQ* z^Kvx}GvE&yKK?*2PbhlIt36tWv9H^<#AXKrHlIbLDebvt8%UfTn7xH?EV9!|q7-eet14_K8jUm^QfVcSFW>kn ztGA!%n#6PI$|{fSZbFN&Wg z@hYprXO1*pBu^xqD*ad9=i44em=K#3=)d zgdn%1X#s4iuQsC??k|7BzmoRq8mfL5qp1FAzfOs5Tk-)%1}CL55z9AxPVgof|K(bW zEjpL4|2PL^0SU!qjr;HXfxmm9BEIo(zyT*G`4nF8;=A(Yd7vF=DphzXMCQ+K2jX=@ z>6o=%ww;%Jpg~jv6|_9J+hkBQ6vCLg-ysBRGQ7UgSl@^{Gf;$7<`UFA{~gho)be2? z>B^QwN~94zv5#XKdFl1X2V6mDyuB~qBiN&I6u?`#V7DzIGVfR@5Kcrnal1__Fb}l< z{!jbwrt_3fa}_B4!@Xzp_}n;B%{ls1P&XJQm9Kxt983>QEdZq z8pvd8Cw@1ZPiM%iYVbD7-OG-*gNvY%K%@TGKKs{hTui)rvjnXXiu7U^*0y5a^*N3t zFdmb-ah*H=;@|ZXx%Pu@sg}PtYqRKv{F?9)$$OFP!2*w>OR8m^>%_GHw46ukyodMw z@+*btN0@C^`!r{~)<0N|$~W{TS?>rd%KD_^pW)Z2pk)}jG^|Shn}VTf-Jm?@pGm*G zoX36QF7f}~n&U)0Qoc)ilOxb7ph!=!>i4=u{ynFt|I_jJ*@P4MMQ(-(9YaCw#=JC%7Xf-Jk4jKg{#XNV-C2YR+9Dzh%09e4M|U_OKJVRF>%R zlX-j3j#5pq7Ms1=QtA;pLKoOa=ec|N`x73zY2i2K{`Cg>CCCo$Ag-m`o~>8+y4EgJ z)?+%e?Kxa`I>@O8uvTfB2w@r1UJoL$BS~tO<1!@fX{hbjbqW}P6!4=q0NBf$UbkRQ zPZw|L;V5JqrSHeX0kaTM$CSnGH9hs*`&p01W;L)o-TGD zb`+k@b}wHK`$r2r9Clqlqy^9SHW@f8pPufI2H*5IKQ(3)7l!YX(=WiOqVgQW0@obS@p71Wt0tmut8z}DD$ z{?K6e;|sia+wJf1)z;tAWjso&96!6ix;@x9n55x>O)88e47U|KuP_@<;X~aFU;l<& zD|hZ25gC@cnZEmNvX%e`JLNFoI@Veb-0@Gpk;45ay4tIh8rWR|m#zwHyWvM2zB)|7 z)(b+c?#QU=;Z3&Ze#s%DHr*vlVLPN>NskwAA_K3EDwDZqK5&XQa!vx~=9Ar-Iw%7r zqxaGddlkfR@=0eY5R#MkGl41xp2Z_9P6DXeWJ_#Che%FczB4dhB)qym)hiCu3t+i; zJnGd;jz>l}xw(w$(*n#EO=|5RDERtKrhOcY%#R0buttd@<#W$dOeGiiFmw4==n>f*{%Gz829+0@?SKh$Kk8K0c}NKm7G$!YgOT0w zfDhp)QTRWThZp!z|1&xJJpVtFjj6my{xi8cQK0KQ;16ixmDM$z?oGu%+s)K+54gt_ zQV&BXXh~h!qR%gLb7?%t0CpKc7KDe?@!KTvm)-py^|Lb^>UX$Kl#kq=9=;xpDIumQ zX0>r8D^UoJinoAe6QG`^t>cp;T>Zr>>DYp73 zQ=e(eZoQ379sP|O2?sd?9oc+Q5BR-K*4{FzFmwzvchm5}zz#jU4WKDi%;lKDnQK}P zN@@UMq%8Kb=5H$ly*HxTAl_SP7t#C(<960{*Bl#Ow(RJ^wG5gpdf+(me1-!Vj^U8> z{@A=;k_9nsJ$B|yF5Z|{&)|XMuH)WieiBD~n$98u*qT?J)pt{53aT^?HY1h%Dnfa# z3H;)!eAANnCWw$`dTU){I%^Wvx+<*gg{vE03)5;xd909<1P(S^c^d16MSwy7T88Rk z{ZfWd8Jo2xfw@F72k-cmf`ZekmIcu&hnZ6eb=1z_qCJj)*TLb5rJ9W>P|92`Dsk_b zAX1*!&MM9}v@j|>+ex0F1DHacE6Awj)gjGwn~G5e;M+l}5NHh^7V9~pSscdezutE$ z6Mwqk(KE*z*aW_0l(*CseXXr*cIpSP^+gmnsbw2Mw93b!WywtF9hhw_d=$}F|%=g20OsQBneI@rg1Ty`H;C+FmGMcCQ>s7+)X+bJ*vpUuuSib+xF$}YH3_qPm^zX z1S>DA{l{giA@u}XB#O-ZHBtF@LtKdaB}dnW1RLBx?%7)3$@pMTt9zN6Y4pf#Xu4;0 zq1skl03CvkMOB`n;7EYxLK3ci_=)%vH}?;MHC;vPwvh#?_yQ(9_G^l zxS#6WL+3qD^4;?bzfp}9elu{cFup-LksA!#U9sZWJQ^t7#VT)m!^FZXr=_(DCb&}N z7tPF>Ki65)sMuiVJ`>WY$nmOstNXF|b>T8MvwRJ>jA^SLzP7pS((DKuq%xvQYJb7R z-GgFV;mp^0$Zl&6XGiDCx5lPnVDH$%Rz&62F(btw-4ZlgzCIPdS@o$!#=^-6)WI3P z@d>XS-WF$X$caxhbD>q&zAfNH7aPTzt4k?XIc6>Y-$Vo}7mD@>E%Z=Kr>_28~ydOFL_tl;GFs~8~N+bTq#)Kl8b!F*_RddWcx9xsAHP zInq~(&J}B86RpUvZN$Rxu0n-%ux=(Y2D)j{6)FBWaNFLti-=92-~rH*+EU3~WVR49cNm;i z4&}-XVy@6%w2iPL*Cri@bXZXUX1XxpbuH~tpS$pKQbc8I^AtO#<2DOrZ7^yW>Z#@a z)J^jm4?_H&FFl!|Z#+7Z-WfozX_1zJ#Zl5fE{!{PVo2y?1!Kt)#DkkklRlS}S>zun z?jUb$4xqI}GFMb%l#j|L8MIJBrw{-d*Fx6HH_(Y$1TJ(8kSoV-LbQ0Vzs;bK<4j6O z-2-TAM1Pb8tCyIWiKoJ0rd~JCPy8I=LDkdxWvwjdPH6L7EAK=l1Ylf2E~hG^0+eek z7P7%(ru@;H?+iI8+%4|hVS|Zw87xH}vI>ltDaw5;0S1$|ss|WAP!_{e)#sD(L61pe z$eI`rB2#VGD??-8Yt&RyrGGJ`4TMK7w-f+ENlW9%?$gn`0?_isk*GeC!j6BI4W^3n zw#JohW$r#;{VKRbs;K(gfQ*{HUhK!ueV~}U#<>9m6QejF|LEYEHxNEKl{@l`mShz-hHe)btvk2mTP|Y^9sW0t7T=G(&wNnKpE! zG_D5jk4#`$s|Yww3VYR08hUlfQUtTPAj8trmLKO^cusC~n8}?g2jt?Hsx)*SrN0Vz zPk*;*W9fX0R4Wd3srsqcl7lwtG?h0K zCHNZqu_3?k6~4DN#^Q^D;j~x+o3P-&k95YSES-$&J2h870+&wa_nPIWg+de=r-gDD zsI*iG}YE3wtqOQ8Gl?X*-iBo|1(M6EVlk44@wFfqOE%2*8}bbpyf*GG_K zwz=Em+Kg!Vo_*j$A1p;{D>)Swxn8TN7TFQsR8@pSoYg|#TEpH#RB3siGI7*{(k0On zbKvc}4?+EudA;871fbvCNG$m|B8ON!*rB9cH_!8^DyXMDz(=vy8LG9ab}ZiRl4?Wm z$QAJl2tKz#G#%{VoW#U#v&nCCcPn05g>10_Hi>rN<*=MHW-X$6CfWLQHzA)5 zJ`H+zwRg33x9divLP?ZfCz>U!5YqcboQ zLIInlOEr|GYc!*gr7JsL`^g#+I?^V~E(Zq^cWG78s1aHp$;8B3G-FoHmnD6$s`}gJ zRE#>l9UAVG4H+ia+BkusnUMn$h-%&AFmoGl?p!NCE&S z#vmg^42`WBK(hJ8l%r)kJ90zs;E#02q|nl%AJ*;Kq)|g=p1z-6wp~$2=PmwcX?b2# zMNGn#eMQ$_@WBP=MiP$ze-~-kv|M+P{_;cS*uBG+i)~{IsUPFgu9+Gc7Flq$Kh(P^mw%LXvl*WZI&btctKojYKm zl+ud~UpctTe2}A1`q`0#45gCTlg9cy(4ZOe&7~6A5EUU2PQP?%&5e^7mC;DyIhnk_ z5o_kqbJy|LIn?~)n}PZM^wyyeM|3=OJw=l(5vd4odS=>g8=xs=10$l2zjwB7AKi{{#-EHDG<7$>A96kVT}qeyG56s5)O(F-4uMrH`M`pix10W>;7`FC zd}A!kQr_V?2}ED;+;sc0v`0*9{;Na__Pn;=O9ztYnJx^VcbO^Z96DTd-Kn#i#hJeo zJl2ML1i2P`n@kX+T9-Qy|uZ6A?+C$t`q#-x23)4R7%}@L1K+{Oh#bS$s#Z zAayFA=yyE^w-H6T_zqmI+;uD~Z`C$LM&4uDX(vC8!4sz*gP#YV220{QMAk)GeTa@H^P@aKmQH&!_5-%~F;LH;)Hg&BLox)^gZ% zq4D;H8vYW~vaZEq$8DpHyW;xO;7~=0AiZHE9rzN_*^R^Y-XOA z4b1|l-`AJ%|A@x1t6`rrMPYL4)79Wii5m@H%2r0~atS)HpD#z_nxW0*_vlKwjV})P zFdM&2_VDH}U-w%TwSL4&XSeEqFk=(&_Gsnf6IX5AZ2{HlfQ150t=!qSKN1^OfWf0@ z=xk$kCNt09dTx?A{No7SQx^vVJLV|=oFaD^jBBv%B8uoIvY^tPB8X*-uWvuWj<5@K zZo$jOf!9d35teOEa85+U8!W^r6j*$IA6W9EI(+#|2r{@z*$YY*n1Z5T57nXVg_$@2U zr>0*p{l!*fj$IQqra!OyJCPrGvN$H|OlKd>c91DFccPj8t9v(ycjt|Sxy#X9` zuU`hk{N9?oyF0X|nAOvk&bE%mJH`oSt%ob;I%~rEF!X}7vx!z76}|fi9HREfCB5CB zq^^c2(fHe)PZunw(oqhnJE+s3P|PLco(=qW>7AsId=N!V@JTj5#9EFLxAS**_iBmT zqnwRjHE>Sq+l@F@^zApj0h8}K2{;(dCEBdsKCOBfVmi0Z#$E_>GI?fg6)A1WO zA>URSgpzZ}Uf7_H@Yk*tD*b2#bpM!ZdgM^Ovhi2)=5LJl3yIpx3GCq`prGd)QNK^de*`54Ymh>`iUAZjGL8kCv^I zhkv#2qr-NBNZh}q{Y-)+-;&aT#6!%}_U$MTz`LQR$LFl_WVWekjQ74HUb;SEJuKgl zwKNZA=vuMS8M>WqBvjk>2E1#0@wfnc7Ou-*nt4TE%`p?LCFOpK)myV6VsV@&>~iIg z3x&I?&(yPj_BKm-_u15YSc;xVsJ)V!T&i5lI;&huIWOMR)f*IzfG6)^9T~9=W5qc1 zPMt6VG?dNL&Ixq>DmuxvtlmM6@n~j6lEXgHM9=E$-5sW*H+L|!+Qpql&mNYEv9xzr z!7z189neBu_BDWwo^0%8f{DRePVuNvo@8W)-Q)^AT(k?|3A)jWXv-hiKU4$5TUl2$ zb97=ecJ|dg+z=+Sy{2%%9`GA(hU;XUL#XjOR(Hl# zA*p%fO+K8YxqibffxUOf^u8v}bU4NZ3MFnE9i<6&;ZBTLxqh?KrNX;cJ@R0Q z>pdJ^fe#Z%hv)?^mHLhzrzK=vjZY2gM}HwOa`$CM$1TsZc!+7f_B!<_PaY&kbXIFK z*Gw@Je^61_(Se((3IylJoEiGew<^OK6QuRYE@uz7&3;3zZ4E~-3p~PD)s_V_#|IAv z#vm9_Sz&x$jeU3;8kV%md;qQ+t){{2igY1&9BcJAsG;+&r=KqjG1R!THSG@0#GpbT z+hKF^-yRL2RhVm1+iiuF0ADyAem`tHzpf>`!8Wc$@I0aySE>hy0jZf0Au&y=y|A#C>Y#o{4k<5>7VOQ3W>NA3AHBbc$ea335&*k!u51 z29v*=#?_tSJtVlM&hRysMxW2^a*in^>y1jh6&e+E7RgzcWZT;X&Xxr|C z?AUPW`|{0I^!EPbHsoUE(6fuTj&Q5czbDo1n(NBw{qQ#R^LyJPR}Tu4=`q727Z)=T zO8A6#51V?Y()Y-X$&l8B6awhd<+bl{Q!c66Sxq&_I5}o+4Wt5BgI-xSEq%TF`(9bd zb&~@GSt#o5$a?h4G`tH#X5$4}QY{<=9UPk{18bR#brD<~z{~qII-)HK<(moB7+Ap5|~<_o1Gp8?-?vx#JDrG=j!TDnnxzGcIV(_#Hu`<)5h7`#G`BHtw!Do61?cf>tc!DB1g$+Ie4@@@FmODcScHBcM_6 zs^J51ASDHoXONES@EV9WUz5LG2hMF_5CFaWnw}3ShOe}eR5TrIb^1kt5lFQFp8DPV zW3fneT-~hIXLLpsCccaVmg9TwE~Z_2x=GPlDfT#^O{CM>V`mUJpVE*!fIt6;drno8JW)-{OZ2IsNP=HL)8cl14M_TOO(kQVS2FO*-DO(oSImF@?Xm*VYsL6VU*56TqE8iMq7*gX9_r19sJ)JujgK-wM=%FH| zeGP5o)l9;^7>?GKPQpj!Kmd!2Tcg#c5$!bR*I`2_yFJtttf)H8T=DsSFe*_fs%Fxg zArF!AqWa8tB*Weh`J*w5FBpHfil9u*$Lq>xiJ{CE>1ww!f=^GTN*xJ}ti%M+%P}Ox zU~#1Oj!R?7SQyAzM^GB5MQVsZj&UsPqXX!4ney`&TtQ71tpS}rffpSkyi7X$Y(u7< z?mwv*FKYUdOyGryN9a7736u~al+%=sePl=I?v}KU@B+1(SZz>9GTAc6QiMH6^mYL7 zhF?$^o;s2?WL^L?NC_k=q>7qM12Xn+?Cx_0eMgy<2hz~ee^midaaV-o6sq(QkXvPY zO^Xqz*njG%%drOZDN|t3Dc9thK!_L1P_Z|zcITRqiA1H#{yEB%4K4`}T?AxY>j#gU zr0JVdKGbt3G}ng9Ke-Yl0V% zK!6u1yD`!@63cWvx;eT{H|NI6*l4Wxa@(~$HC@lyVBpFrWox#@+~0ah>FVpHFwx`g z4YuCUu*rZII&@({)1)C;`H7&dI)B~Bh7q!*a1Pwieti>WNxQMdl*H{WiSmUBcrViT7ScQbn;?&Jd31Zq30@rkyoHjFa)=yA%Daur<%!Zzd2MSs)>V_eW^ro z?}5GbSAjrG?1crkM=FQ<3$ABC9($tB#qs?mv7L|*uWg}b1Iu=A>je@e43zaf3Ar0v zGG2UDLPp!Cupt{W`yA3)En2HKbyXjvu11CIgUAXmwKYnMMZ43LB^6*5=26|EfksJGRMmEDfE@Eg_uS=cU zTLSp$i?R$HQ>^XGfG(lh^fQ9L{4<+##i}=&I5QIq`ixozgSdq)HtV#bhKXsiE0rxQ z)Y86&?&4@{_Vpe_{50{+$cBcctqJRkL^Ee{#`-D(U{8xc#|*)mEogDc(1wPst|zj!U4M$8O{C)MO`x-dqLA|-ly8F?y(9Rpb4wX^!@*hDCbPi z%hf?qlV&a+4Z^m>ciaLs{rP`}sFAG>C9!!ixBu{qOoAD^F44sW0IdP6ZSjP={-Wy* zUHwjBs_kLupEo*k2=)8OO|AmG0UaC*6~xkj=9~_*@E81L0?^S5GkmEsC0{Fi^7O_T z9=$!x?CkkI3bTt_Y1ce*^**J`;%vw^@t)4(^JFbA<4vqZByfVk=zw#o?mm92KpiCo zwW(HxqkfbY=ZBHFApt@ZE)b%0{6!QA5TbDPJ^vi!|7q<^6uzWA0Lhl0wSD|>&fJiVegp`!Or`=SpIbkdJb;EU9ABz5UC!6a?+UcY! zkT(xpoHw98$bSL)-wZ?^R4n-CgFBO;mmZ7^7$(`~4UWG+@@U+(X6p6-$vG#A&AQFRS<7RRK>1qW^&}`@d?8Us`*4D_D}il`nQb(#M`}M0o$L;@ zl4@x4Au>Cq&oJ~QjE3-mNJr9EW+gaqBCfdD}lLhxQf+%$-!+w6-1jFGer7Ic&Wpt+n=MbZ!8y4WAJ4-a(1lsY?UL_AJDx__aAc^9ncj zQQ9j2LtstRkGW$)S$UVNe7xpzovZbL%_ix;_)*IV!Vme=>yBUv>IXg<+Z>(i?DFlw zUZty0_I{6Z#=S5uAycf*na;d$fvq!EF?$2t+H*zF}V-F->8;CC@ z$2%ADB%b21=lLi1B_*Id0N`&PAmaDGJV5D1$YEEhn&kdg&X)J`lr8b?9!TA*9CY;U z(EP4;dwVt=bsO`&>q|Jn(u1OXJwGVfTYr&%Y!aZS>AWt6!o+J>U_ND=+82v|0-~b? zPF%FpaAF(VP;oVjd}3eao)mrS=c=Tx%>aD9zrr9eiNDJkEpq_GO2BvD6r6`R z;ECv%1fQSt`7e2g;#}4_BCJ(p?ply0GZnPwj;B{5oYm#-V1wqw{E9~$bWtTrBi^O+ z3nl#AXUhwOL|uokh$nO2fajPid6ca~?5}6Z&#-fIA%3Zaiwt2z9yY*0(8 z81I84X#GNu=7=AuK&jg)z^ju!{|cU`qrT)H*#7@JlqL`JbN?4g3v;QWy#rqdc8H<% zjMLv~k9-XSGwuz`Nrj@~OU})q(LA8d=GtQo*?1!V{WZpZp`I6V%-87D7YA?13 zW;WFuy?87`5Dl-~vpNDH*IQ7Oe9Ajsy;G9aufOsCTLaY5sq}}UXZzhWs=?A?;yY+t z|5M&V?xN_)kWcG|Cwof*RMCsdhF8z~2dSp!9Q=tQLKHt#vC*84fD;tK;Sq&0B z=P{?(v1CFOFhl2xpx5)(wq$B3-FE}e)xy_vFxTH++_Hnr`D>O_zuBtz2Mv8oBs&L2 zlu&LP_BpRF&Xl3o5in?j1#)4Vvv!?(YpACBF21OaK)3P|$ac); zb>*aOFOM>{wCh8|)AX3~Me;!~IcN1{V!5q^>?TM?f!Ws#%seHWcubz&*KC_t^oF2u zH|!T1st}t$M){xnnBqS>0t&RCE;{rcIR5TGD*|6*h2P%qoPARl-b9iP8>m*^y7fb& z9O`tY?5<{?aN>5oQCP6knK-i+4kpcfK@l!uEi#hRegz2vYf0dA0L2QDQZfr0L(s3{ zn9FpU2aJQhFP*G~B^q!RX;6)8$hQ73g(~xCA$Ur|tQ1)k@jkM_jbst^(NX(Oy=_M+ zQ@`kMVtFo8?w#&Bc%fphK*eBtDr0ELg#)=rPDePG&j-YLH3)s?c77xD*~FqM4{YXC z*&r#uT-RPitT&DjH8Lr>?Jfl7s{ghRL& zieOcT;2ZeC*=${O-e$VKyZs6cY!anU7`%D1pJWn^&kT@=WMCUu-cE$rUi2-VeGik~ zu7+#Z%w2)i?>^Huvv`JQDnA_#P!6z@dJupKlPHupY(4z@I$43SwLbP6;!VsLJ)|MT zOHYcfXh-9aQ>FHWh{TahOx{?(j8};^FNSPtdA~a^M8y+87b$khewnVXp?$^8tjcRj zmRYizI@ecqW`R17&4f96diX5eACfH?{gZUm)m*!{cy|RF>5Ha zuu7tnFjCPE0ifodU@G9w#0m!t|3MgdMJ34I>85&E%nWx7UL-q|T-l|0%$c=^bQB4S zW|FCD{p`agMfhvYE{ItvIw1Pi^Y_S`J`$rcgM90T${mr$gYSPwc9>80?NZ{W_h;SJ z?s7=C%OpQRm^2aRRO*lQxiz9(v30S$w{>FNtljlIkoKG#8>o`~Z2UK*4}13}FdLcp zT*EsF6iWS5^2^E3dr9LGCUA6g`i*5^Q5xm#X2Wn|nFi%8V7C0z8%q(j(9N(~>y13M z;LWgOne_BafP___hY*Wx=dCZ2C1+poVoOf`#)gbdxT(Tdi?sr@;5E}_?RKJ1N_jJ> z#mA2{nVH0~f7^r0mqwqT{~&*t!cSL>hXJ?IOdasX9xj_Qhey)ocw(5ECCj7yac(tY zuCiLlnMVn@Ti9<7yqTTvsL%G4XcJ$R_;kTnp1xPkzr4+J1lW;Jwm zL5T9?t|22XXpVGsqQKF?sdz1F><(8)z}e=#be-sI`2eWwp%J~V-z!_=JaT@$dzqA+ zL;M`XBSz+58!~5@T7wO(Xk9M{AE+M@8P(4fza!Mq55zFI(r||?V?hjK@wINV8>xqX z{&uct?^wrHw5U$$O2eD7jQ1<+8=0$n97dFGLZ)$)ZZLtuIg;hG^uQGKQKxyT(Ng#F zyY~@m&#dy~r^AvCst!2rnpNPwbBhTMsiX^E=YDdU36Ah^GGBW3Y3z5l@1k<9unlvY z@iw8;94>!!MGEJ1;&p$VkNj0px`@|6Dhk)ye=3T|?OKiHcciPgh0`qU!Je~{0h|~x z?wVcTzF4d}E}`ac16Q(f`iUC33*U%>Fr3_pJA}P6vZ(@Pf%Ke#d)#f_&+FaigwZSV zZGS$MQa1{~^cHfdL&LGUFy|k@d&dde1_tt>c1N7xchc~N-Y7}mq>J?Ucznb-X>GB8 zoyR-ybUWfAZgyH97W-Gyure+Yj;VeNDn6oNW}~lP0{%2P(KXXp@BGBfU}%t*fz446 zWEjE9D^MN5kE*9*%&CM1utI{G6}XPHJM@(&~% zkkK1sU^z1sQ$F7yhN|e8aREZI7@oGiZWZT!Xr94dBQstE(z*hU)`&UDQY%4Gqat2J zbevuUL8Y?SkX8gCjeaU$8ah@QN7=%Hu&V(Tp7y)>mx9)CQfOlf2~h;?1h{Epmr&A> zmjYe+n%dp?zC{WHwcqh%)C~2~y^Z^%A-RjP_{sxW8U=FOgT-*PcfDE;Uk!PV0_M=e zFg;as*o)FL75?;wCQWJfp75XDg4DC&E*^&z~~{JUwWX!!2+$P8<{SmP*qD_;%^yY z9GP9#$^tzhjiG`YJ=mO?P9_nJtAcBvOuT1wif!ZmZeipdJHDrfXZIcnmAz?Hfy2$T zal?q`;eZSYTf)~Q4nILFuhA^WfKDgtp%sO`LLyW+$llZ&Q2xnM=~pIQtQm_OlfBNW zlV+o+vV(25jVGG8gn)YR9nC-F$VJOlmF9)}b8^{e9Qtyzy93i`<^`GgwtET&sIlrD z@E>=r6qaa4PRFxvU`kt=#VH44ud&~D30==0FXk*S$^xk$89rQ2+6KQ*uJcoEVK7wO z8lp!=HjvCpF3q&eYATDfc3euX%(SeA^$>i0-yRlT8LUMSLoI8h>@3`HvPgc8cSJp1 z2(W$Z-mus!Ouv$%4h-2?16nM!D?fd1YXj~VOfo{Y6*3nZIHjN(BUea)FgK|DsS3>Am=E$#*NCS&|la~%? zSv%#mTRBxmhyM-X0KLv)TM^Cmz|` zn+d6P30d|5Dcpd+&yY$(dC-Pj1&CPeO#^n9xrULin zFBE}v+aSbYU30UXzfeT7Ml({~2!f*2JPsb!5TmDI_0+aCIj>=)@$`ggP$^ey73e=LN=D`vN+` zpT5Dx*7yKAS|1L8M~Qz}a+veCV)*o3-eQ@&S)2=lG5gXiDe_EpE&j0Z`v`r-#_!h7 z^Wz)naXFZdJF#SQgi4{{mGd9r5K1TedHB;R+5|b62Vxwh@(|aluY3{yCQ=NW{Lq|d zo1r88$YPOl_w(Kv`mN}9`*5#%IHYqi&0t{>8O%zvQOx1sPk6dj8V+H13d7%a3O!$J zu0x`f5*-W_Sld3b@{6Me&l)!{#`}5iVU6FvJ9X*h;KsdjAJ>W#zP@#|`Xr^fjY&nT zCZW{E0tE2xiMIL`aQYu_-m$*^@s1--u)4Sea1ElBhx8`c5K@(L(>I~=oXY11C(dPO zScTh?3Gy$vW}(W<`?_1@M;c$D^?|rYnWN}P`I;q%FMpcQ<&v(__Jc&r=5wg zQvt`oN_di%xyQaHhTbuNlA_6Gw&h4*&8Yt#bvEFl z`-5OH8FHc)gp9hla#pWW&U|XfS9vRpFIp5$rkcO2Sjt7MlC&TOq&TE(vQ1)(noV*< zq^eb@o3MXiBx$83xzQ_F*~kfY2AZl_Dxd93Ro8X&ub+Ok%Hc0>YIaH2A(X04qHd}_ zSs8?dLD?QbF)n#1GLur?&m1P+8PM!qyh($cT9jmqqI=9s5~{>JCvnp{G!fDT2Lrd z)Ht0Y%g2GRg(~p5qyk*kV%O-;*?;Q@zLC4L*z*JF1Ctosfg#A7nh3dnYe{<-)yUle zTp`<75R%yZ>DeOJ2nl-#M0$?+KsGV1YVm6WM@Jxia14_>fH!3u@0U}9G!%3GbOiKt zd{(W*wb8bFpgI(_`n8Td)w&nRO8xJC-A*v;?OI4Eu%&=b<^9&kutF6YJz8hgVHq0U zm_5yU5Gr|a^S14$><%^aXXlLlX1IAO`7|kW;$k$}0JXHZ>!IYxKRph-{VUbncW!sK z*xB%d0LMz^{BO~`m+i(pm`+^KUL=vMJcVb-Y=Rt$88vHH-}&nNLmG{j`_8CIT);F3 zcMnqmBi%;Oj+8S9V|sxXPkJ~)D)h6D2JRwT|CKsmb_b_YqYA>beS&tg@a`(V8JuB> zjsw3t?idCMHe1}K_aW5%e1*DRpZ@&gkrpiDSK7=C z1#KQr8xibq?32+k4ND%+jPa+pQ})WMkfWg_+eW;$wKt%DD(ET3U4P+qIf7Wv-}pftEdLfDYIO<=$#3ib4TnVFDF{4P z+5kMXJA{-KRAUKEgaw4SgF(%W>khpOQ-~i#7lNQhu#cWgLb-gC9)Qy{_@-oFR~9PB zpCgzq5iliRMj(!fE40ogj_BZ+N%IqvmzXC;y)>AcPY%;!#I_;=!fTuckbkbK^n;YY zRtkbq0M)$oD}>B9!ZmOQ_jZz*`s;S-z}{qEY7_|MQ8{+uA1CK_n1n2F>`G`pDoA`7zm1JP^_r(MLY)P zJQ&fp7)Sm{?m^tJ=hcL$FlD3Qct}3Xli=F@Y;`KUKiFYSW~@QK^!`(F;IHIA@EJh8 z{K{kC-tA+R3HdCN0kMQ&=$QE#w48dhzH@e-AIwdhQ3O!CE~N+%KKcAn_)vZ4n8H6u zTQf{i%XHDg`{$qoQW@&jgSf-*ykfj&;L}4hi{R6hgMJgU*IiyU*6zNu za(K3IF?qjmA>F7X@Fn)l8_R9d$|Co!4&X8yjR7$z0^B71xlz8SMF zG;KlqwOpHspNnxqio!pl%Q;hU4eV{Z?jK-|oA-4V^+q_p;O4A?$^0ZIAVE^F@i)8H zQBMHh9W3Sg!WY<$4jFu6i9Ca}QA7r6;o<(k>uoOY2gAV6`vo>RbAOL(5KXiNc9FTm zQUS`CWagQs^lnFcu9e7aZwyjt#HG36+^%`KzYi9QZW%`xm;IMD$=F)|fY?DkGECH= z4OWsU2H^^Y3>gv|U4*GYyI_QwEIzfC1kX{5KYw52 z=-MGjZpkCY>c(3Uq=*!=57#*griHlO`DRSW&WD*1&^W(t}xH(^HaSK4D8~>1F^p0kf`zLkB`p4vq zGcO{`_mqp=Z$yjbcHM$S-2lNgomzEjPzB+qXKN)`zYpQ)^~GMk?tl%Az5Xasm~rIu z$3H~Ayiph7yBBARyPup?zUwnX#a5jHcm@yeMfO`AW7D$Djyy@7RSCmJM_a0K`Xq4d zadWJuJxM)f59BSJc9GA-e_q(BOAcA}x!!~7A6;EUvzv+if9ls};x1#H!)_x88(abQ;#2Qo0Dwa1IgE4Hk5h=S+mKjoM~S z;*VyOT8j)d{CU?Vs3z_f-oVwG%pcg)>XM3UcrZ<4kVhDiHHl@-Ns>)$)0wBL@5=}LslZH1R&NZTs;rP(YpaOuy-B~J`De_F3vL? z&b8a)L>Dc389j(TqxUF5^fodGLL|g6f`lm1dx;Psh%VX)qL=8sM;(kPqqnX166dk^ zKG%8Q^XY!Bxo4hd&3u^uy?$%`*PW-&K44mZQ-{I`LDRq~fViFiQH%^thQ2FfGk2saOpgaeF#q3u+SDdbX3B2 z3b301L_ycCl@oC@KW@zSJFs-fJPk+pF+f1Xd|`yl6T851qgk{AHL?5-IB(3;@X6%O zb5%;0%`-fADBAx?FO@#euy|B;X5q}y@FvmsAFe`DtAo5JN1wXG*Tb>g6H1UXHj8VD z%M9D!%Ql+BF%4#(*axgOPuT`*kHs~BE<|sF7jfk_W|qoDW52QNyNZj{4xcX<&?%X%*zg| zpo(A#nx(dzR73e~HQ% zKvXbkEGPjyTG--V8)cVUvQ`uv0TwV&%;%ZNi;c8TF_LDC)=cSs$sFQX6F!oCU&AX9 z$XNlNavZ+*)?w6Gkdw~DQlKXGYT%=JH6lEcpAuYjFRp-)cKW`R87H?={t6>K>?^vH z5^<-r1oE|@psBt`#W0r&T)ZUHDl9}lF=y~V$7YiXTx5`uxs(!6`ySf-xrRzT;DdpI zxwd0aSs`~0;jjJUJcf||+$-}ce*=4wNXPFzw%F~XFQ^$!h9;;C7ZP%bdBtk$;mWrt z;#-eeB$HuF!CUqaIK9O2H)@D^$LGM2lfyjf_`RzUt0co(;klJRw(=69`P5SUo|K%)Nrs8=V26-Pq1{x^@E%IG)--XwzI)W(NQo z>35sxp!RU%eNHT2rojxs)7AnRts7J&bli68Xj_A6EyN+J(LiX!Z=k8m&$nnXMECpS zlOzYnY?FuTGuYQ^rZ(}SwS0ZGY%O23`v>&uAs|?*)N6uFJhUDmykrg#MTz2NMp97H zSvW0@S^KkXr(eSn_|aN#_@X*vp{b;fsg@nFBV;s?7LV^`*H?V5vbzIMz0{br{V%>z z1!R;!Wo>I&g;|8u9IEMZm@U@o|FZ>R`=SmO$M0!3H!kh`wk4tAxNL^Gz5<1M=1RqoiS4KdYc90*9KrUzV3Cs=YOHb-FWU3q~b zji2p0-=}7J`KGIVZ_HLr>8hRSwQy3#iNfs7j*vvFS3|?kr1`n_Lt&QVa~7LzXj7+c zMSa8c!0R2qfW6c~uto`a+k+g1Gmy!rYl={YPIt3CY5LB+ATz6_tK+Aq#hD)2uxo-{YtscZKF*12rf-~|~&~M}j{=cAqz7=%M z{}XhxR}S`B7S2y?=DDB#x1jT*QBY+-&xrs%_Ytr)l728GvYPoTU?n~9#3j+5I7L6% z0MCa^&IVuR6$y1117uj_z6E73Gd6yK&`(*SRcsUvpV!o@~BAnH6ZCO*P!tW zh85{Z(#l_$a39)DY`fiZq@9P35>GOgUyZ^|wdDJtgOkIYPD##7!ybw{G?5YRYFkm) z<0raFoM1sq@$Mw2YO~o6e#+$gr717zG}grqSERbn-h29nlajeST>ZWKG0k-oL_nmI z2D6COZr5Iq9nm<7WWNCH3CNmx{0#k%pQ3TRDF?3SNpuS7SP%ayF~Q$F0zdqJa{iE( zdu^3@UI^iMfWhNv#JF#S4X%(s9AHvjy38w{WnSf;m$V=TO{1(`4@k#zdsLUK5>l7A z@~0jnB1&j>3ltvZkGdqKdZ@bKG z9)Pkh0Lo4y2Pk`>UAU8B)I#g>GH_K~q_Jo9makRx+uD1sz%RpV9f5W|#l`=i1iSFD zNe++J!o93A>V}if6TnGvp4=)9XnWh9W*jF!OSEp5NA9o-Gr90TC;`Rc2?kJtsq2CJC!XQ5-YKVlB$B*p1q-5hZAX7Rn?ug~GBE!bu^7uj)982X2o06XP zX$|vIu+&M494KA?g#OAamDS+H5S^xY5*f%@+8>o|GsS|lK9W3BBfQ(}qPuigH<*0x z!Sqkr=JOwEI||&rU;Rp8Q7c#O6;t0=*CsRQ)|h0S&6k3Dd$SwM*L%7MD&k*yuWsA& zZr65&eMtlV77d%sZ^>a~9nk%}lN_{V*fR2gJe23d>A*QD?^ROQm*JiJ`<5Ecj!RKl zIm_OwiXU~Bn`8$0yjwN)**Bi2#r3NRCqA|HT~*(C8NhwnY|} z_z59O=&&8L;i{@XLuU*`4;o4XSpwVZV`=&t8b%g8_u-fbEBXLitJS)v^*>P{tOL=*~Vd z6gPl6REJrEjYK~cS7hDoUr6w{u%#&yfGq@?Ig0p=)hQ3a__6eOA}#QkD^cV2z2KiK zxy)Zz?Ty@ECj$>{1cQNs@)dtr%=cih?0J@7^>*s&4%y6oic;CmGQX}P!`YtnLO!-yEj%6sX|q#yRVSY*flRaqe*%rQ+Xa?K zWscW!=pNMaD^NvW3#q+hQ|LRRP?v_s{0d$zQFEVjc5u=BDu;~wbth-Oo1S&XPWV~I zP)(OzyGY=6ui&YlVD=Y0w&wFoVN)7Wsep$X^;*k=$5$H}$|R*FuVef#fK#_cC8g-2 z2!~j3-o2pjK~$y`*7}@*CIk;kZZLS_tA1{=*_+HHo3(QjO1$vbd~QLI56Gva-`;!4 zGrxBfEGGQKlTWx9sTmUZTpUf2x|UWeQ`rj3AqD4gpcl4A@aduV5PK7^a4hv-R<=%N zlY$E<(F;Yu>qhK|J!5;7=qJVK1^7tl0tnMFnMH~aM`PLWWs@T0(O5yZt2o-94$6Rd z<#2l|BE+kIKl-X@G?c#Btg023OLz@^8{t%jx&?XjyztZi>h-kTs zjFvd6dWA!R43;<{Oxf419pwcKQ=T8dh1tJCl8c2 zFN+QrIka#Gw3_l|goR7A7FKen)Y9najd`ss7t_W(tz8E1+TMrOoIf&F8)gf6r4So7?faRSg6jxRm^ z4)fbgMju)N0LQxgk3zZR@TwcJw8sy?IwEm39rc8e4^I|amPa00nq7L0Jl({L(Mr%+ zkC671!XAeyOWot@y32EbVm1~9YOsksgF@VTm9~P->r?62hlU<%wpK4j{3CcDwfj$f zXB=zM(zantj*3Pyf+2PA7hRohq)A`;#7Sb$;V(Etqj{J*`Yt!Rcb_%(A(=2lxyiFH zdN$h^7u)K82d37hV+T>{g)MWc(vr|8cql&#*<44+Dm^i;YAMoG;889tVqGH_Y?i%T z(LuS>XqV-G7@QdiJ68$Xb$VT*>$E%n;Pq?j-FSqEq|;?!YlLNd->0Z*QB~ofx(Lfe zfjZ_!`RrkR3%uUCi%>XhT0f+fh81aHtU|N;#J2!-4E13pamsIM%0f?yLtUIZ!{E=x z^gHVkSdj<|l?j60s$+-A6uQDGwE_!EIm-T)qIFmjgnE;pH*6Lbn(Tqu6RSfF0PsJEgZfksqPYCLfdja?!bYACE+F(%_%+ zBtfe{h2WY+&Z=UEZ=w0Mwth|0##?d3L6=kmg=R6(q^J9FUPs%*u!mK?f3~iU`&n=H zPxo8VRaZswb{Y-|EJ9EplVY!G(+pu)X$f8b0{2SP#5L?ntXb~nN0Y+&@(%Bx?(FlK zC6NhEx&N%=eoC8x;Jd#Td&l5}la?!J>s9^gG}Qac(wz}gbYQ++zx(Sly9~_Gi0Nip z&M#Ugx&Q}1oehDFlu^68?yq0>IS)JfaEx0z$PB5 z{P1mdT@u8w7Ihwc**fkb6zbWtZy%m}9TuZdSejBe$`svi7bDc@dlzLI;C8Gbtc^1B za!}Mtv`i|lIzqK1@;7=+r)a$ChV*=C&tb#yhjb>Ywn)*I}-^f_MhjMip|i?Oor=qlRa;m z6+nIc$uvFq$%e4b>#k_@I%0*Qm*cKcbhzURwM`%TG_3QLv(4ea-O4K0&$Bx=b4MVy z)WzD&Rh6m76er$n?(FWRmaYe#yLl@j}xZblh9tA1D0T zAU3A~s+JtLXPQNHzUNk1p{u~|S6%m~I;FYQ^Jn};_00I>4MJeI@r=_&*L=eJ37mz6 zfcRJYq~2%86tJPkMWgRGgDtt#=E_=pUsR#(+}0Xeb-VXZ+nFg(hV!q!inzUPo3R!% zrjTTA?Fze2KCjhXQ)36IpXsBzt<%To{&C6paqAmk0D>u|V$-1D!A~CR*_-RwA1I}t zv*IYlV-_K)c|$3P6X}D)Qasix>YvLuXX~BA-Mb)QwkBaIJw)aY;ZKE&_U5(S-67$` z!;h!yPqZrd+3R-ifTcQDRC0Ub(pc5d;8$H?0COy1v43T#`3* z`*^BhTh=^g24R>&A>Q)kN$x!xVo&8#S-xfII^L4cxLpoyf_et74NubrJS8S_+c2si zoQE_!0v(4o&W0(AqAR_$fqBJH*2JsLlwZ>R~a|AwuJn zUNVXxnJee6>S&XaRuwQOVV=BjagQ{wrI&?+Q}x|btZM1yY(=6g;(6Nh7SJi#)~V@y zj1qWLlX0Z^N3t#w<^=~m7-wo`VUPqKlA=lI&s^H`_n2c^Bdw*ca&cd)I;@!Wo93RJ zTfHS-;qMlbh)EbCXg892Chg%pDmkUeYU#na!LME#HEd+cN}}iFQ@u>he}{XO=LO~r zinh~oF6g+V^h%$)bnJC=-Dh&_6z+=Q@eNiu`*L%5gN=oCbAyBRKCBROo<@N6KP{ Date: Fri, 26 Jun 2026 14:57:23 +0300 Subject: [PATCH 06/11] CI fix --- .github/workflows/python-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index d8b48d7..a3d510d 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -41,7 +41,7 @@ jobs: - name: Compare output with reference run: | gunzip -c examples/reference/reference_0.json.gz > expected.json - diff -u reference_0.json expected.json + diff -u res/reference_0.json expected.json - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 From 7b61b8b1b4aa99fc8ffec7188832e13ea27b7b7a Mon Sep 17 00:00:00 2001 From: uslstenn Date: Sat, 27 Jun 2026 02:26:00 +0300 Subject: [PATCH 07/11] Introdude data-flow functionality --- src/uScope/O3.py | 3 +- src/uScope/converter.py | 101 +++++++++++++++++++++++++++++++--------- src/uScope/events.py | 11 +++++ src/uScope/main.py | 7 +++ src/uScope/parser.py | 56 ++++++++++++++++++++++ 5 files changed, 155 insertions(+), 23 deletions(-) diff --git a/src/uScope/O3.py b/src/uScope/O3.py index 9e0db5c..af865c5 100644 --- a/src/uScope/O3.py +++ b/src/uScope/O3.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from enum import Enum from typing import Dict, List @@ -37,6 +37,7 @@ class Instruction: stage_order: List[PipelineStage] store_tick: int = 0 core_id: int = 0 + producers: List[int] = field(default_factory=list) @property def mnemonic(self): diff --git a/src/uScope/converter.py b/src/uScope/converter.py index 2a62699..147e44c 100644 --- a/src/uScope/converter.py +++ b/src/uScope/converter.py @@ -3,7 +3,7 @@ from tqdm import tqdm from .O3 import PipelineStage, Instruction -from .events import MetadataEvent, DurationEvent +from .events import MetadataEvent, DurationEvent, FlowEvent from .thread_pool import StageLaneManager from .config import IConfig from .parser import PipeViewParser @@ -18,6 +18,7 @@ def __init__( exclude_pipeline: bool = False, only_committed: bool = False, store_completions: bool = True, + exclude_flow: bool = False, ): self.parser: PipeViewParser = parser if not isinstance(config, IConfig): @@ -31,6 +32,7 @@ def __init__( self.exclude_pipeline: bool = exclude_pipeline self.only_committed: bool = only_committed self.store_completions: bool = store_completions + self.exclude_flow: bool = exclude_flow self.metadata_events: List[MetadataEvent] = [] self.duration_events: List[DurationEvent] = [] @@ -39,6 +41,11 @@ def __init__( self.func_units_managers: Dict[str, StageLaneManager] = {} self.store_lane_manager: Optional[StageLaneManager] = None + self._fu_seq_to_idx: Dict[int, int] = {} + self._fu_info: Dict[int, Tuple[int, int, int, int, str, str]] = {} + self._pending_flows: Dict[int, List[FlowEvent]] = {} + self._flow_id: int = 0 + def convert(self, progress: bool = True) -> List[dict]: self._add_metadata() instructions = self.instructions_by_seq_num() @@ -55,10 +62,19 @@ def convert(self, progress: bool = True) -> List[dict]: self._add_pipeline_stage_events(instr) if not self.exclude_exec: self._add_execution_unit_events(instr) + if not self.exclude_flow and instr.producers: + self._wire_flow_for_instr(instr) if self.store_completions and instr.store_tick > 0: self._add_store_completion_event(instr) - return [e.to_dict() for e in self.metadata_events + self.duration_events] + if self.exclude_flow: + return [e.to_dict() for e in self.metadata_events + self.duration_events] + result = [e.to_dict() for e in self.metadata_events] + for idx, evt in enumerate(self.duration_events): + result.append(evt.to_dict()) + for f in self._pending_flows.get(idx, []): + result.append(f.to_dict()) + return result def instructions_by_seq_num(self): return sorted(self.parser.instructions.values(), key=lambda x: x.seq_num) @@ -161,9 +177,48 @@ def _add_pipeline_stage_events(self, instr: Instruction): "Stage": self.config.get_stage_name(stage), "OpClass": instr.opclass, "Disasm": instr.disasm, - }, - ) + }, ) + ) + + def _wire_flow_for_instr(self, instr: Instruction): + cons_info = self._fu_info.get(instr.seq_num) + if cons_info is None: + return + cons_issue, cons_complete, cons_pid, cons_tid, _cu, _cc = cons_info + cons_idx = self._fu_seq_to_idx[instr.seq_num] + for prod_seq in instr.producers: + prod_info = self._fu_info.get(prod_seq) + if prod_info is None: + continue + prod_issue, prod_complete, prod_pid, prod_tid, prod_unit, prod_cname = prod_info + prod_idx = self._fu_seq_to_idx[prod_seq] + self._flow_id += 1 + fid = str(self._flow_id) + s_event = FlowEvent( + name="dep", + ph="s", + id=fid, + bp="e", + cat=prod_unit, + cname=prod_cname, + pid=prod_pid, + tid=prod_tid, + ts=prod_complete, + ) + self._pending_flows.setdefault(prod_idx, []).append(s_event) + f_event = FlowEvent( + name="dep", + ph="f", + id=fid, + bp="e", + cat=prod_unit, + cname=prod_cname, + pid=cons_pid, + tid=cons_tid, + ts=cons_issue, + ) + self._pending_flows.setdefault(cons_idx, []).append(f_event) def _add_execution_unit_events(self, instr: Instruction): if not instr.opclass: @@ -184,25 +239,27 @@ def _add_execution_unit_events(self, instr: Instruction): dur = complete - issue cname = self._cname_for(instr) - self.duration_events.append( - DurationEvent( - name=mnemonic, - cat=unit, - ts=issue, - dur=dur, - pid=pid, - tid=tid, - cname=cname, - args={ - "PC": instr.pc, - "SeqNum": instr.seq_num, - "OpClass": instr.opclass, - "Unit": unit, - "Duration": dur, - "Disasm": instr.disasm, - }, - ) + evt = DurationEvent( + name=mnemonic, + cat=unit, + ts=issue, + dur=dur, + pid=pid, + tid=tid, + cname=cname, + args={ + "PC": instr.pc, + "SeqNum": instr.seq_num, + "OpClass": instr.opclass, + "Unit": unit, + "Duration": dur, + "Disasm": instr.disasm, + }, ) + idx = len(self.duration_events) + self._fu_seq_to_idx[instr.seq_num] = idx + self._fu_info[instr.seq_num] = (issue, complete, pid, tid, unit, cname) + self.duration_events.append(evt) def _add_store_completions_metadata(self): store_name = self.config.get_stage_name(PipelineStage.STORE_COMPLETE) diff --git a/src/uScope/events.py b/src/uScope/events.py index 91d6f9c..8a0dc9e 100644 --- a/src/uScope/events.py +++ b/src/uScope/events.py @@ -27,3 +27,14 @@ class DurationEvent(Event): cname: Optional[str] = None ph: str = "X" tid: Optional[int] = None + + +@dataclass +class FlowEvent(Event): + id: str + ts: int + ph: str + bp: str + cat: Optional[str] = None + cname: Optional[str] = None + tid: Optional[int] = None diff --git a/src/uScope/main.py b/src/uScope/main.py index c69d9a9..b1a1483 100644 --- a/src/uScope/main.py +++ b/src/uScope/main.py @@ -36,6 +36,7 @@ def _convert_and_dump( trace_parser, config, args.exclude_exec, args.exclude_pipeline, args.only_committed, args.store_completions, + args.exclude_flow, ) events = converter.convert(progress=progress) logger.info(f"Writing {output_file}") @@ -118,6 +119,12 @@ def main(): action="store_false", help="Disable store completion tick events" ) + parser.add_argument( + "--exclude-flow", + default=False, + action="store_true", + help="Exclude data-flow dependency arrows from output" + ) args = parser.parse_args() diff --git a/src/uScope/parser.py b/src/uScope/parser.py index 96b0354..ce8168b 100644 --- a/src/uScope/parser.py +++ b/src/uScope/parser.py @@ -10,6 +10,7 @@ def __init__(self): self.current_seq_num = None self.current_instr = None self.stage_map = {f"{stage}": stage for stage in PipelineStage.order()} + self.pending_producers = {} def parse_file(self, filename: str): with open(filename, "r") as f: @@ -56,6 +57,48 @@ def _parse_stage_line(rest: str): store_tick = 0 return stage_name, tick, store_tick + @staticmethod + def _parse_deps_line(rest: str): + first = rest.index(":") + core_id = int(rest[:first]) + rest = rest[first + 1 :] + second = rest.index(":") + seq_num = int(rest[:second]) + producers_str = rest[second + 1 :] + if producers_str: + producers = [int(p) for p in producers_str.split(",")] + else: + producers = [] + return core_id, seq_num, producers + + def _apply_producers(self, core_id, seq_num, producers): + instr = self.instructions.get((core_id, seq_num)) + if instr is not None: + instr.producers = list(set(instr.producers) | set(producers)) + else: + existing = self.pending_producers.get((core_id, seq_num)) + if existing is not None: + existing.extend(p for p in producers if p not in existing) + else: + self.pending_producers[(core_id, seq_num)] = list(producers) + + def _merge_producers(self, core_id, seq_num, producers): + instr = self.instructions.get((core_id, seq_num)) + if instr is not None: + existing = set(instr.producers) + for p in producers: + if p not in existing: + instr.producers.append(p) + existing.add(p) + else: + existing = self.pending_producers.get((core_id, seq_num)) + if existing is not None: + for p in producers: + if p not in existing: + existing.append(p) + else: + self.pending_producers[(core_id, seq_num)] = list(producers) + def parse_line(self, line: str): if not line.startswith(self.PREFIX): return @@ -85,6 +128,19 @@ def parse_line(self, line: str): self.current_instr.stages[PipelineStage.FETCH] = tick self.current_instr.stage_order.append(PipelineStage.FETCH) + + if (core_id, seq_num) in self.pending_producers: + self.current_instr.producers = self.pending_producers.pop((core_id, seq_num)) + return + + if rest.startswith("deps:"): + core_id, seq_num, producers = self._parse_deps_line(rest[5:]) + self._apply_producers(core_id, seq_num, producers) + return + + if rest.startswith("memdeps:"): + core_id, seq_num, producers = self._parse_deps_line(rest[8:]) + self._merge_producers(core_id, seq_num, producers) return if self.current_instr is not None: From 7c95b921eb128d06684983ec5c4aa2f9398b715c Mon Sep 17 00:00:00 2001 From: uslstenn Date: Sat, 27 Jun 2026 02:26:33 +0300 Subject: [PATCH 08/11] [tests] Added data-flow check tests --- tests/conftest.py | 75 ++++++++++++++++ tests/test_flow.py | 216 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 291 insertions(+) create mode 100644 tests/test_flow.py diff --git a/tests/conftest.py b/tests/conftest.py index 7dd6425..df06d00 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -244,3 +244,78 @@ def trace_with_unordered(tmp_path: Path) -> Path: trace_file = tmp_path.joinpath("trace_with_unordered.out") trace_file.write_text(content) return trace_file + + +@pytest.fixture +def trace_with_deps(tmp_path: Path) -> Path: + content = """\ +O3PipeView:deps:0:4:2,3 +O3PipeView:deps:0:3:1 +O3PipeView:deps:0:2:1 +O3PipeView:deps:0:1: +O3PipeView:fetch:1000:0x1000:0:1:add x4, x1, x2:IntAlu +O3PipeView:decode:1100 +O3PipeView:rename:1150 +O3PipeView:dispatch:1200 +O3PipeView:issue:1300 +O3PipeView:complete:1400 +O3PipeView:retire:1500:store:0 +O3PipeView:fetch:2000:0x1004:0:2:add x5, x3, x4:IntAlu +O3PipeView:decode:2100 +O3PipeView:rename:2150 +O3PipeView:dispatch:2200 +O3PipeView:issue:2300 +O3PipeView:complete:2400 +O3PipeView:retire:2500:store:0 +O3PipeView:fetch:3000:0x1008:0:3:add x6, x5, x1:IntAlu +O3PipeView:decode:3100 +O3PipeView:rename:3150 +O3PipeView:dispatch:3200 +O3PipeView:issue:3300 +O3PipeView:complete:3400 +O3PipeView:retire:3500:store:0 +O3PipeView:fetch:4000:0x100c:0:4:sw x6, 0(a0):MemWrite +O3PipeView:decode:4100 +O3PipeView:rename:4150 +O3PipeView:dispatch:4200 +O3PipeView:issue:4300 +O3PipeView:complete:4400 +O3PipeView:retire:4500:store:0 +""" + trace_file = tmp_path.joinpath("trace_with_deps.out") + trace_file.write_text(content) + return trace_file + + +@pytest.fixture +def trace_with_deps_and_memdeps(tmp_path: Path) -> Path: + content = """\ +O3PipeView:deps:0:3:1 +O3PipeView:deps:0:2:1 +O3PipeView:deps:0:1: +O3PipeView:memdeps:0:3:2 +O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3:IntAlu +O3PipeView:decode:1100 +O3PipeView:rename:1150 +O3PipeView:dispatch:1200 +O3PipeView:issue:1300 +O3PipeView:complete:1400 +O3PipeView:retire:1500:store:0 +O3PipeView:fetch:2000:0x1004:0:2:sw x1, 0(a0):MemWrite +O3PipeView:decode:2100 +O3PipeView:rename:2150 +O3PipeView:dispatch:2200 +O3PipeView:issue:2300 +O3PipeView:complete:2400 +O3PipeView:retire:2500:store:0 +O3PipeView:fetch:3000:0x1008:0:3:lw x2, 0(a0):MemRead +O3PipeView:decode:3100 +O3PipeView:rename:3150 +O3PipeView:dispatch:3200 +O3PipeView:issue:3300 +O3PipeView:complete:3400 +O3PipeView:retire:3500:store:0 +""" + trace_file = tmp_path.joinpath("trace_with_deps_and_memdeps.out") + trace_file.write_text(content) + return trace_file diff --git a/tests/test_flow.py b/tests/test_flow.py new file mode 100644 index 0000000..1d4e95b --- /dev/null +++ b/tests/test_flow.py @@ -0,0 +1,216 @@ +import pytest + +from uScope.O3 import PipelineStage +from uScope.converter import ChromeTracingConverter +from uScope.parser import PipeViewParser +from uScope.events import FlowEvent +from uScope.config import Config + + +PIPELINE_CATS = frozenset({ + "Fetch", "Decode", "Rename", "Dispatch", + "Issue", "Complete", "Retire", "Store Complete", +}) + + +def assert_producers(parser, seq_num, expected, core_id=0): + assert parser.instructions[(core_id, seq_num)].producers == expected + + +def find_fu_event(events, seq_num): + return next( + e for e in events + if e.get("ph") == "X" + and e.get("args", {}).get("SeqNum") == seq_num + and e.get("cat") not in PIPELINE_CATS + ) + + +def assert_flow_counts(events, expected_pairs): + s_events = [e for e in events if e.get("ph") == "s"] + f_events = [e for e in events if e.get("ph") == "f"] + assert len(s_events) == expected_pairs + assert len(f_events) == expected_pairs + return s_events, f_events + + +def assert_flow_paired(flow_s, flow_f): + assert {e["id"] for e in flow_s} == {e["id"] for e in flow_f} + + +def assert_flows_after_fu(events, seq_num, expected_s, expected_f): + fu = find_fu_event(events, seq_num) + idx = events.index(fu) + s_after = [] + f_after = [] + for j in range(idx + 1, len(events)): + ph = events[j].get("ph") + if ph == "s": + s_after.append(events[j]) + elif ph == "f": + f_after.append(events[j]) + elif ph == "X": + break + assert len(s_after) == expected_s + assert len(f_after) == expected_f + return s_after, f_after + + +def flow_event(**kwargs): + kwargs.setdefault("name", "dep") + return FlowEvent(**kwargs) + + +class TestParseDeps: + + def test_parse_deps(self, trace_with_deps): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps)) + + assert_producers(parser, 1, []) + assert_producers(parser, 2, [1]) + assert_producers(parser, 3, [1]) + assert_producers(parser, 4, [2, 3]) + + def test_parse_deps_before_fetch(self): + parser = PipeViewParser() + parser.parse_line("O3PipeView:deps:0:2:1") + assert parser.pending_producers[(0, 2)] == [1] + + parser.parse_line("O3PipeView:fetch:1000:0x1000:0:2:add x1,x2,x3:IntAlu") + assert parser.current_instr.producers == [1] + assert (0, 2) not in parser.pending_producers + + parser.parse_line("O3PipeView:fetch:2000:0x1004:0:3:add x4,x5,x6:IntAlu") + assert_producers(parser, 2, [1]) + + def test_parse_deps_line(self): + parser = PipeViewParser() + core, seq, prods = parser._parse_deps_line("0:42:1,2,3") + assert core == 0 + assert seq == 42 + assert prods == [1, 2, 3] + + core, seq, prods = parser._parse_deps_line("0:5:") + assert core == 0 + assert seq == 5 + assert prods == [] + + def test_parse_memdeps_merge(self, trace_with_deps_and_memdeps): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps_and_memdeps)) + + assert_producers(parser, 3, [1, 2]) + assert_producers(parser, 1, []) + assert_producers(parser, 2, [1]) + + def test_parse_memdeps_before_fetch(self): + parser = PipeViewParser() + parser.parse_line("O3PipeView:deps:0:3:1") + parser.parse_line("O3PipeView:memdeps:0:3:2") + assert parser.pending_producers[(0, 3)] == [1, 2] + + parser.parse_line("O3PipeView:fetch:3000:0x1008:0:3:lw x2,0(a0):MemRead") + assert parser.current_instr.producers == [1, 2] + + parser.parse_line("O3PipeView:fetch:4000:0x100c:0:4:add x7,x8,x9:IntAlu") + assert_producers(parser, 3, [1, 2]) + + def test_parse_memdeps_only(self): + parser = PipeViewParser() + parser.parse_line("O3PipeView:memdeps:0:5:4") + assert parser.pending_producers[(0, 5)] == [4] + + parser.parse_line("O3PipeView:fetch:1000:0x1000:0:5:lw x5,0(a0):MemRead") + assert parser.current_instr.producers == [4] + + parser.parse_line("O3PipeView:fetch:2000:0x1004:0:6:add x7,x8,x9:IntAlu") + assert_producers(parser, 5, [4]) + + +class TestFlowEvents: + + def test_minimal(self): + e = flow_event(ph="s", id="1", bp="e", pid=200, tid=0, ts=100) + d = e.to_dict() + assert d["name"] == "dep" + assert d["ph"] == "s" + assert d["id"] == "1" + assert d["bp"] == "e" + assert d["pid"] == 200 + assert d["ts"] == 100 + assert "cat" not in d + assert "cname" not in d + + def test_with_cat(self): + e = flow_event(ph="f", id="42", bp="e", pid=201, tid=1, ts=200, + cat="ReadPort", cname="cq_build_attempt") + d = e.to_dict() + assert d["cat"] == "ReadPort" + assert d["cname"] == "cq_build_attempt" + assert d["ph"] == "f" + + def test_none_omitted(self): + e = flow_event(ph="s", id="1", bp="e", pid=200, ts=100) + d = e.to_dict() + assert "tid" not in d + + +class TestConverterFlows: + + def test_interleaving(self, trace_with_deps, config: Config): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps)) + converter = ChromeTracingConverter(parser, config) + events = converter.convert() + + flow_s, flow_f = assert_flow_counts(events, 4) + + for fe in flow_s: + idx = events.index(fe) + prev_x = next(e for e in reversed(events[:idx]) + if e.get("ph") == "X" and e.get("pid") == fe["pid"]) + assert prev_x["pid"] == fe["pid"] + + def test_multiple_producers(self, trace_with_deps, config: Config): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps)) + converter = ChromeTracingConverter(parser, config) + events = converter.convert() + + flow_s, flow_f = assert_flow_counts(events, 4) + assert_flow_paired(flow_s, flow_f) + + assert_flows_after_fu(events, 4, expected_s=0, expected_f=2) + assert_flows_after_fu(events, 1, expected_s=2, expected_f=0) + + def test_cat_from_producer(self, trace_with_deps, config: Config): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps)) + converter = ChromeTracingConverter(parser, config) + events = converter.convert() + + flow_s = [e for e in events if e.get("ph") == "s"] + flow_f = [e for e in events if e.get("ph") == "f"] + + for s in flow_s: + assert "cat" in s + assert "cname" in s + f = next(e for e in flow_f if e["id"] == s["id"]) + assert s["cat"] == f["cat"] + + def test_excluded_exec(self, trace_with_deps, config: Config): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps)) + converter = ChromeTracingConverter(parser, config, exclude_exec=True) + events = converter.convert() + + assert not [e for e in events if e.get("ph") in ("s", "f")] + + def test_exclude_flow_flag(self, trace_with_deps, config: Config): + parser = PipeViewParser() + parser.parse_file(str(trace_with_deps)) + converter = ChromeTracingConverter(parser, config, exclude_flow=True) + events = converter.convert() + + assert not [e for e in events if e.get("ph") in ("s", "f")] From e43dd825cf65e87200e64195acf7825fa6e56924 Mon Sep 17 00:00:00 2001 From: uslstenn Date: Sat, 27 Jun 2026 02:27:28 +0300 Subject: [PATCH 09/11] [tests] Reference was updated --- examples/reference/reference.out | 148 +++++++++++++++++++++++++ examples/reference/reference_0.json.gz | Bin 22504 -> 25627 bytes 2 files changed, 148 insertions(+) diff --git a/examples/reference/reference.out b/examples/reference/reference.out index fad7124..db80232 100644 --- a/examples/reference/reference.out +++ b/examples/reference/reference.out @@ -1,3 +1,14 @@ +O3PipeView:deps:0:2:1 +O3PipeView:deps:0:4:3 +O3PipeView:deps:0:6:5 +O3PipeView:deps:0:8:2 +O3PipeView:deps:0:9:4 +O3PipeView:deps:0:10:8,9 +O3PipeView:deps:0:11:8,9 +O3PipeView:deps:0:12:8,9 +O3PipeView:deps:0:13:8,9 +O3PipeView:deps:0:14:6 +O3PipeView:deps:0:15:2 O3PipeView:fetch:78500:0x00010144:0:1:auipc a0, 1:IntAlu O3PipeView:decode:79000 O3PipeView:rename:79500 @@ -5,6 +16,30 @@ O3PipeView:dispatch:80500 O3PipeView:issue:80500 O3PipeView:complete:81000 O3PipeView:retire:82000:store:0 +O3PipeView:deps:0:16:4 +O3PipeView:deps:0:17:6 +O3PipeView:deps:0:19:18 +O3PipeView:deps:0:21:20 +O3PipeView:memdeps:0:21:14 +O3PipeView:deps:0:23:22 +O3PipeView:memdeps:0:23:14 +O3PipeView:deps:0:25:21 +O3PipeView:memdeps:0:25:14 +O3PipeView:deps:0:26:23 +O3PipeView:memdeps:0:26:14 +O3PipeView:deps:0:27:25,26 +O3PipeView:deps:0:28:25,26 +O3PipeView:deps:0:29:17,12 +O3PipeView:deps:0:30:21 +O3PipeView:deps:0:31:23 +O3PipeView:memdeps:0:32:14 +O3PipeView:deps:0:33:16 +O3PipeView:memdeps:0:33:14 +O3PipeView:deps:0:34:32,33 +O3PipeView:deps:0:35:32,33 +O3PipeView:deps:0:36:32,33 +O3PipeView:deps:0:37:32,33 +O3PipeView:deps:0:38:17 O3PipeView:fetch:78500:0x0001014c:0:3:auipc a1, 1:IntAlu O3PipeView:decode:79000 O3PipeView:rename:79500 @@ -12,6 +47,13 @@ O3PipeView:dispatch:80500 O3PipeView:issue:80500 O3PipeView:complete:81000 O3PipeView:retire:137000:store:0 +O3PipeView:deps:0:40:16 +O3PipeView:deps:0:41:17 +O3PipeView:deps:0:43:42 +O3PipeView:deps:0:45:44 +O3PipeView:memdeps:0:45:38,14 +O3PipeView:deps:0:47:46 +O3PipeView:memdeps:0:47:38,14 O3PipeView:fetch:78500:0x00010148:0:2:ld a0, 532(a0):MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 @@ -19,6 +61,15 @@ O3PipeView:dispatch:80500 O3PipeView:issue:81000 O3PipeView:complete:81500 O3PipeView:retire:137000:store:0 +O3PipeView:deps:0:49:45 +O3PipeView:memdeps:0:49:38,14 +O3PipeView:deps:0:50:47 +O3PipeView:memdeps:0:50:38,14 +O3PipeView:deps:0:51:49,50 +O3PipeView:deps:0:52:49,50 +O3PipeView:deps:0:53:41,36 +O3PipeView:deps:0:54:45 +O3PipeView:deps:0:55:47 O3PipeView:fetch:78500:0x00010154:0:5:auipc a2, 1:IntAlu O3PipeView:decode:79000 O3PipeView:rename:79500 @@ -47,6 +98,27 @@ O3PipeView:dispatch:80500 O3PipeView:issue:81000 O3PipeView:complete:81500 O3PipeView:retire:141500:store:0 +O3PipeView:deps:0:57:56 +O3PipeView:deps:0:59:58 +O3PipeView:memdeps:0:59:53 +O3PipeView:deps:0:61:60 +O3PipeView:memdeps:0:61:53 +O3PipeView:deps:0:63:62 +O3PipeView:memdeps:0:63:53 +O3PipeView:deps:0:65:59 +O3PipeView:memdeps:0:65:53 +O3PipeView:deps:0:66:61 +O3PipeView:memdeps:0:66:53 +O3PipeView:deps:0:67:65,66 +O3PipeView:deps:0:68:65,66 +O3PipeView:deps:0:69:65,66 +O3PipeView:deps:0:70:63,67 +O3PipeView:deps:0:71:63 +O3PipeView:memdeps:0:72:53 +O3PipeView:memdeps:0:73:53 +O3PipeView:deps:0:74:72,73 +O3PipeView:deps:0:75:72,73 +O3PipeView:deps:0:76:36 O3PipeView:fetch:78500:0x00010160:0:8:lw a4, 0(a0):MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 @@ -54,6 +126,22 @@ O3PipeView:dispatch:80500 O3PipeView:issue:136000 O3PipeView:complete:136500 O3PipeView:retire:189000:store:0 +O3PipeView:deps:0:80:79 +O3PipeView:deps:0:82:81 +O3PipeView:memdeps:0:82:76,53 +O3PipeView:deps:0:84:83 +O3PipeView:memdeps:0:84:76,53 +O3PipeView:deps:0:86:85 +O3PipeView:memdeps:0:86:76,53 +O3PipeView:deps:0:88:82 +O3PipeView:memdeps:0:88:76,53 +O3PipeView:deps:0:89:84 +O3PipeView:memdeps:0:89:76,53 +O3PipeView:deps:0:90:88,89 +O3PipeView:deps:0:91:88,89 +O3PipeView:deps:0:92:88,89 +O3PipeView:deps:0:93:86,90 +O3PipeView:deps:0:94:86 O3PipeView:fetch:79000:0x0001017c:0:15:addi a0, a0, 4:IntAlu O3PipeView:decode:79500 O3PipeView:rename:80000 @@ -558,6 +646,20 @@ O3PipeView:dispatch:190000 O3PipeView:issue:194000 O3PipeView:complete:204000 O3PipeView:retire:205000:store:0 +O3PipeView:deps:0:95:94,91 +O3PipeView:deps:0:96:94 +O3PipeView:deps:0:100:99 +O3PipeView:deps:0:102:101 +O3PipeView:memdeps:0:102:95,93 +O3PipeView:deps:0:104:103 +O3PipeView:memdeps:0:104:95,93 +O3PipeView:deps:0:106:105 +O3PipeView:memdeps:0:106:95,93 +O3PipeView:deps:0:108:102 +O3PipeView:memdeps:0:108:95,93 +O3PipeView:deps:0:109:104 +O3PipeView:memdeps:0:109:95,93 +O3PipeView:deps:0:110:108,109 O3PipeView:fetch:182500:0x000101dc:0:63:ld a2, 424(a2):MemRead O3PipeView:decode:183000 O3PipeView:rename:183500 @@ -565,6 +667,12 @@ O3PipeView:dispatch:184500 O3PipeView:issue:185000 O3PipeView:complete:185500 O3PipeView:retire:0:store:0 +O3PipeView:memdeps:0:111:95,93 +O3PipeView:memdeps:0:112:95,93 +O3PipeView:deps:0:113:111,112 +O3PipeView:deps:0:114:111,112 +O3PipeView:deps:0:115:111,112 +O3PipeView:deps:0:116:113 O3PipeView:fetch:189500:0x000101e0:0:87:addi a3, zero, 2:IntAlu O3PipeView:decode:190000 O3PipeView:rename:190500 @@ -572,6 +680,10 @@ O3PipeView:dispatch:191500 O3PipeView:issue:191500 O3PipeView:complete:192000 O3PipeView:retire:241500:store:0 +O3PipeView:deps:0:118:114 +O3PipeView:deps:0:123:122 +O3PipeView:deps:0:125:124 +O3PipeView:memdeps:0:125:118,116,95,93 O3PipeView:fetch:189000:0x000101dc:0:86:ld a2, 424(a2):MemRead O3PipeView:decode:189500 O3PipeView:rename:190000 @@ -579,6 +691,15 @@ O3PipeView:dispatch:191000 O3PipeView:issue:191500 O3PipeView:complete:192000 O3PipeView:retire:241500:store:0 +O3PipeView:deps:0:127:126 +O3PipeView:memdeps:0:127:118,116,95,93 +O3PipeView:deps:0:129:128 +O3PipeView:memdeps:0:129:118,116,95,93 +O3PipeView:deps:0:131:125 +O3PipeView:memdeps:0:131:118,116,95,93 +O3PipeView:deps:0:132:127 +O3PipeView:memdeps:0:132:118,116,95,93 +O3PipeView:deps:0:133:131,132 O3PipeView:fetch:189500:0x000101e4:0:88:flw ft0, 0(a0):FloatMemRead O3PipeView:decode:190000 O3PipeView:rename:190500 @@ -929,6 +1050,29 @@ O3PipeView:dispatch:243500 O3PipeView:issue:250500 O3PipeView:complete:252500 O3PipeView:retire:253500:store:0 +O3PipeView:deps:0:137:136,134 +O3PipeView:deps:0:138:136 +O3PipeView:deps:0:142:141 +O3PipeView:deps:0:144:143 +O3PipeView:memdeps:0:144:137,135 +O3PipeView:deps:0:146:145 +O3PipeView:memdeps:0:146:137,135 +O3PipeView:deps:0:148:147 +O3PipeView:memdeps:0:148:137,135 +O3PipeView:memdeps:0:150:137 +O3PipeView:memdeps:0:151:137 +O3PipeView:deps:0:152:150,151 +O3PipeView:deps:0:153:150,151 +O3PipeView:deps:0:154:152 +O3PipeView:deps:0:156:155,153 +O3PipeView:deps:0:157:155 +O3PipeView:deps:0:161:160 +O3PipeView:deps:0:163:162 +O3PipeView:memdeps:0:163:156,154 +O3PipeView:deps:0:165:164 +O3PipeView:memdeps:0:165:156,154 +O3PipeView:deps:0:167:166 +O3PipeView:memdeps:0:167:156,154 O3PipeView:fetch:286500:0x00010248:0:136:addi a2, a2, 4:IntAlu O3PipeView:decode:287000 O3PipeView:rename:287500 @@ -1321,6 +1465,10 @@ O3PipeView:dispatch:341000 O3PipeView:issue:341000 O3PipeView:complete:341500 O3PipeView:retire:0:store:0 +O3PipeView:deps:0:192:191,190 +O3PipeView:deps:0:193:191,190 +O3PipeView:deps:0:194:192 +O3PipeView:deps:0:196:195,193 O3PipeView:fetch:343500:0x00010284:0:190:vle32_v_micro v1, 0(a0), zero:SimdUnitStrideLoad O3PipeView:decode:344000 O3PipeView:rename:344500 diff --git a/examples/reference/reference_0.json.gz b/examples/reference/reference_0.json.gz index f54119f4dca8fd749d52356337e0591136ce071c..a9c13b5e19bc2435d8d1c81c65de996fca3f8ce4 100644 GIT binary patch literal 25627 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 Date: Sat, 27 Jun 2026 14:30:31 +0300 Subject: [PATCH 10/11] Data flow option supported --- src/uScope/converter.py | 8 ++++---- src/uScope/main.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/uScope/converter.py b/src/uScope/converter.py index 147e44c..c30526f 100644 --- a/src/uScope/converter.py +++ b/src/uScope/converter.py @@ -18,7 +18,7 @@ def __init__( exclude_pipeline: bool = False, only_committed: bool = False, store_completions: bool = True, - exclude_flow: bool = False, + data_flow: bool = False, ): self.parser: PipeViewParser = parser if not isinstance(config, IConfig): @@ -32,7 +32,7 @@ def __init__( self.exclude_pipeline: bool = exclude_pipeline self.only_committed: bool = only_committed self.store_completions: bool = store_completions - self.exclude_flow: bool = exclude_flow + self.data_flow: bool = data_flow self.metadata_events: List[MetadataEvent] = [] self.duration_events: List[DurationEvent] = [] @@ -62,12 +62,12 @@ def convert(self, progress: bool = True) -> List[dict]: self._add_pipeline_stage_events(instr) if not self.exclude_exec: self._add_execution_unit_events(instr) - if not self.exclude_flow and instr.producers: + if self.data_flow and instr.producers: self._wire_flow_for_instr(instr) if self.store_completions and instr.store_tick > 0: self._add_store_completion_event(instr) - if self.exclude_flow: + if not self.data_flow: return [e.to_dict() for e in self.metadata_events + self.duration_events] result = [e.to_dict() for e in self.metadata_events] for idx, evt in enumerate(self.duration_events): diff --git a/src/uScope/main.py b/src/uScope/main.py index b1a1483..0815ffb 100644 --- a/src/uScope/main.py +++ b/src/uScope/main.py @@ -36,7 +36,7 @@ def _convert_and_dump( trace_parser, config, args.exclude_exec, args.exclude_pipeline, args.only_committed, args.store_completions, - args.exclude_flow, + args.data_flow, ) events = converter.convert(progress=progress) logger.info(f"Writing {output_file}") @@ -120,10 +120,10 @@ def main(): help="Disable store completion tick events" ) parser.add_argument( - "--exclude-flow", + "--data-flow", default=False, action="store_true", - help="Exclude data-flow dependency arrows from output" + help="Add data-flow dependency" ) From 1e88a3f6959ad3964be66ab016566090e60bc0d3 Mon Sep 17 00:00:00 2001 From: uslstenn Date: Sat, 27 Jun 2026 14:57:42 +0300 Subject: [PATCH 11/11] Uscope was supported as standalone option --- src/uScope/parser.py | 51 +++++++++++++++++-------- tests/conftest.py | 91 ++++++++++++++++++++++++++++---------------- tests/test_flow.py | 20 +++++----- 3 files changed, 104 insertions(+), 58 deletions(-) diff --git a/src/uScope/parser.py b/src/uScope/parser.py index ce8168b..381e4de 100644 --- a/src/uScope/parser.py +++ b/src/uScope/parser.py @@ -3,6 +3,7 @@ class PipeViewParser: PREFIX = "O3PipeView:" + USCOPE_PREFIX = "uScopeView:" def __init__(self): self.instructions = {} @@ -34,10 +35,18 @@ def get_core_ids(self): @staticmethod def _parse_fetch_line(rest: str): parts = rest.split(":", 5) - if len(parts) != 6: + if len(parts) < 5: return None - tick_str, pc, core_id_str, seq_str, disasm, opclass = parts - return int(tick_str), pc, int(core_id_str), int(seq_str), disasm.strip(), opclass.strip() + tick_str, pc, pos2, seq_str, disasm = parts[:5] + opclass = parts[5].strip() if len(parts) > 5 else "" + return int(tick_str), pc, int(pos2), int(seq_str), disasm.strip(), opclass + + @staticmethod + def _parse_usinfo_line(rest: str): + parts = rest.split(":", 2) + if len(parts) != 3: + return None + return int(parts[0]), int(parts[1]), parts[2].strip() @staticmethod def _parse_stage_line(rest: str): @@ -100,10 +109,32 @@ def _merge_producers(self, core_id, seq_num, producers): self.pending_producers[(core_id, seq_num)] = list(producers) def parse_line(self, line: str): - if not line.startswith(self.PREFIX): + is_usview = line.startswith(self.USCOPE_PREFIX) + if is_usview: + rest = line[len(self.USCOPE_PREFIX) :] + elif line.startswith(self.PREFIX): + rest = line[len(self.PREFIX) :] + else: return - rest = line[len(self.PREFIX) :] + if is_usview: + if rest.startswith("deps:"): + core_id, seq_num, producers = self._parse_deps_line(rest[5:]) + self._apply_producers(core_id, seq_num, producers) + return + if rest.startswith("memdeps:"): + core_id, seq_num, producers = self._parse_deps_line(rest[8:]) + self._merge_producers(core_id, seq_num, producers) + return + if rest.startswith("usinfo:"): + result = self._parse_usinfo_line(rest[7:]) + if result is not None: + us_core_id, us_seq_num, us_opclass = result + if self.current_instr is not None and self.current_seq_num == us_seq_num: + self.current_instr.core_id = us_core_id + self.current_instr.opclass = us_opclass + return + return if rest.startswith("fetch:"): result = self._parse_fetch_line(rest[6:]) @@ -133,16 +164,6 @@ def parse_line(self, line: str): self.current_instr.producers = self.pending_producers.pop((core_id, seq_num)) return - if rest.startswith("deps:"): - core_id, seq_num, producers = self._parse_deps_line(rest[5:]) - self._apply_producers(core_id, seq_num, producers) - return - - if rest.startswith("memdeps:"): - core_id, seq_num, producers = self._parse_deps_line(rest[8:]) - self._merge_producers(core_id, seq_num, producers) - return - if self.current_instr is not None: stage_name, tick, store_tick = self._parse_stage_line(rest) stage_name = stage_name.lower() diff --git a/tests/conftest.py b/tests/conftest.py index df06d00..4881c31 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -47,21 +47,24 @@ def minimal_parser() -> PipeViewParser: @pytest.fixture def trace_with_in_order(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3:IntAlu +O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 O3PipeView:rename:1150 O3PipeView:dispatch:1200 O3PipeView:issue:1300 O3PipeView:complete:1400 O3PipeView:retire:1500:store:0 -O3PipeView:fetch:2000:0x1004:0:2:lw a0, 0(a1):MemRead +O3PipeView:fetch:2000:0x1004:0:2:lw a0, 0(a1) +uScopeView:usinfo:0:2:MemRead O3PipeView:decode:2100 O3PipeView:rename:2150 O3PipeView:dispatch:2200 O3PipeView:issue:2300 O3PipeView:complete:2400 O3PipeView:retire:2500:store:0 -O3PipeView:fetch:3000:0x1008:0:3:mul x10, x21, x11:IntMult +O3PipeView:fetch:3000:0x1008:0:3:mul x10, x21, x11 +uScopeView:usinfo:0:3:IntMult O3PipeView:decode:0 O3PipeView:rename:0 O3PipeView:dispatch:0 @@ -77,14 +80,16 @@ def trace_with_in_order(tmp_path: Path) -> Path: @pytest.fixture def trace_with_squashed(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:1000:0x1000:0:1:lw a1, 4(a1):MemRead +O3PipeView:fetch:1000:0x1000:0:1:lw a1, 4(a1) +uScopeView:usinfo:0:1:MemRead O3PipeView:decode:0 O3PipeView:rename:0 O3PipeView:dispatch:0 O3PipeView:issue:0 O3PipeView:complete:0 O3PipeView:retire:0:store:0 -O3PipeView:fetch:2000:0x1004:0:2:lw a0, 0(a1):MemRead +O3PipeView:fetch:2000:0x1004:0:2:lw a0, 0(a1) +uScopeView:usinfo:0:2:MemRead O3PipeView:decode:0 O3PipeView:rename:0 O3PipeView:dispatch:0 @@ -100,7 +105,8 @@ def trace_with_squashed(tmp_path: Path) -> Path: @pytest.fixture def trace_with_missing_stages(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3:IntAlu +O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 O3PipeView:rename:1150 O3PipeView:issue:1300 @@ -115,7 +121,8 @@ def trace_with_missing_stages(tmp_path: Path) -> Path: @pytest.fixture def trace_with_empty_lines(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3:IntAlu +O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 @@ -125,7 +132,8 @@ def trace_with_empty_lines(tmp_path: Path) -> Path: O3PipeView:complete:1400 O3PipeView:retire:1500:store:0 -O3PipeView:fetch:2000:0x2000:0:2:lw a0, 0(a1):MemRead +O3PipeView:fetch:2000:0x2000:0:2:lw a0, 0(a1) +uScopeView:usinfo:0:2:MemRead O3PipeView:decode:2100 O3PipeView:rename:2150 O3PipeView:dispatch:2200 @@ -142,7 +150,8 @@ def trace_with_empty_lines(tmp_path: Path) -> Path: def trace_with_invalid_lines(tmp_path: Path) -> Path: content = """\ This is a garbage line -O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3:IntAlu +O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 something else O3PipeView:rename:1150 @@ -159,14 +168,16 @@ def trace_with_invalid_lines(tmp_path: Path) -> Path: @pytest.fixture def trace_with_ilp(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:1000:0x1000:0:1:add x3, x1, x2:IntAlu +O3PipeView:fetch:1000:0x1000:0:1:add x3, x1, x2 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 O3PipeView:rename:1150 O3PipeView:dispatch:1200 O3PipeView:issue:1300 O3PipeView:complete:1400 O3PipeView:retire:1500:store:0 -O3PipeView:fetch:1000:0x1004:0:2:add x3, x2, x4:IntAlu +O3PipeView:fetch:1000:0x1004:0:2:add x3, x2, x4 +uScopeView:usinfo:0:2:IntAlu O3PipeView:decode:1100 O3PipeView:rename:1150 O3PipeView:dispatch:1200 @@ -182,21 +193,24 @@ def trace_with_ilp(tmp_path: Path) -> Path: @pytest.fixture def trace_with_pipelined(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:137000:0x000101b4:0:53:div a7, a4, a5:IntDiv +O3PipeView:fetch:137000:0x000101b4:0:53:div a7, a4, a5 +uScopeView:usinfo:0:53:IntDiv O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 O3PipeView:issue:192500 O3PipeView:complete:202500 O3PipeView:retire:203500:store:0 -O3PipeView:fetch:137000:0x000101b8:0:54:add s2, a6, a7:IntAlu +O3PipeView:fetch:137000:0x000101b8:0:54:add s2, a6, a7 +uScopeView:usinfo:0:54:IntAlu O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 O3PipeView:issue:202500 O3PipeView:complete:203000 O3PipeView:retire:204000:store:0 -O3PipeView:fetch:137000:0x000101bc:0:55:sw s2, 0(a2):MemWrite +O3PipeView:fetch:137000:0x000101bc:0:55:sw s2, 0(a2) +uScopeView:usinfo:0:55:MemWrite O3PipeView:decode:137500 O3PipeView:rename:138000 O3PipeView:dispatch:139000 @@ -212,28 +226,32 @@ def trace_with_pipelined(tmp_path: Path) -> Path: @pytest.fixture def trace_with_unordered(tmp_path: Path) -> Path: content = """\ -O3PipeView:fetch:78500:0x00010148:0:2:ld a0, 548(a0):MemRead +O3PipeView:fetch:78500:0x00010148:0:2:ld a0, 548(a0) +uScopeView:usinfo:0:2:MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 O3PipeView:issue:81000 O3PipeView:complete:81500 O3PipeView:retire:137000:store:0 -O3PipeView:fetch:78500:0x00010154:0:5:auipc a2, 1:IntAlu +O3PipeView:fetch:78500:0x00010154:0:5:auipc a2, 1 +uScopeView:usinfo:0:5:IntAlu O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 O3PipeView:issue:80500 O3PipeView:complete:81000 O3PipeView:retire:141000:store:0 -O3PipeView:fetch:78500:0x0001015c:0:7:addi a3, zero, 2:IntAlu +O3PipeView:fetch:78500:0x0001015c:0:7:addi a3, zero, 2 +uScopeView:usinfo:0:7:IntAlu O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 O3PipeView:issue:80500 O3PipeView:complete:81000 O3PipeView:retire:141500:store:0 -O3PipeView:fetch:78500:0x00010150:0:4:ld a1, 548(a1):MemRead +O3PipeView:fetch:78500:0x00010150:0:4:ld a1, 548(a1) +uScopeView:usinfo:0:4:MemRead O3PipeView:decode:79000 O3PipeView:rename:79500 O3PipeView:dispatch:80500 @@ -249,32 +267,36 @@ def trace_with_unordered(tmp_path: Path) -> Path: @pytest.fixture def trace_with_deps(tmp_path: Path) -> Path: content = """\ -O3PipeView:deps:0:4:2,3 -O3PipeView:deps:0:3:1 -O3PipeView:deps:0:2:1 -O3PipeView:deps:0:1: -O3PipeView:fetch:1000:0x1000:0:1:add x4, x1, x2:IntAlu +uScopeView:deps:0:4:2,3 +uScopeView:deps:0:3:1 +uScopeView:deps:0:2:1 +uScopeView:deps:0:1: +O3PipeView:fetch:1000:0x1000:0:1:add x4, x1, x2 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 O3PipeView:rename:1150 O3PipeView:dispatch:1200 O3PipeView:issue:1300 O3PipeView:complete:1400 O3PipeView:retire:1500:store:0 -O3PipeView:fetch:2000:0x1004:0:2:add x5, x3, x4:IntAlu +O3PipeView:fetch:2000:0x1004:0:2:add x5, x3, x4 +uScopeView:usinfo:0:2:IntAlu O3PipeView:decode:2100 O3PipeView:rename:2150 O3PipeView:dispatch:2200 O3PipeView:issue:2300 O3PipeView:complete:2400 O3PipeView:retire:2500:store:0 -O3PipeView:fetch:3000:0x1008:0:3:add x6, x5, x1:IntAlu +O3PipeView:fetch:3000:0x1008:0:3:add x6, x5, x1 +uScopeView:usinfo:0:3:IntAlu O3PipeView:decode:3100 O3PipeView:rename:3150 O3PipeView:dispatch:3200 O3PipeView:issue:3300 O3PipeView:complete:3400 O3PipeView:retire:3500:store:0 -O3PipeView:fetch:4000:0x100c:0:4:sw x6, 0(a0):MemWrite +O3PipeView:fetch:4000:0x100c:0:4:sw x6, 0(a0) +uScopeView:usinfo:0:4:MemWrite O3PipeView:decode:4100 O3PipeView:rename:4150 O3PipeView:dispatch:4200 @@ -290,25 +312,28 @@ def trace_with_deps(tmp_path: Path) -> Path: @pytest.fixture def trace_with_deps_and_memdeps(tmp_path: Path) -> Path: content = """\ -O3PipeView:deps:0:3:1 -O3PipeView:deps:0:2:1 -O3PipeView:deps:0:1: -O3PipeView:memdeps:0:3:2 -O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3:IntAlu +uScopeView:deps:0:3:1 +uScopeView:deps:0:2:1 +uScopeView:deps:0:1: +uScopeView:memdeps:0:3:2 +O3PipeView:fetch:1000:0x1000:0:1:add x1, x2, x3 +uScopeView:usinfo:0:1:IntAlu O3PipeView:decode:1100 O3PipeView:rename:1150 O3PipeView:dispatch:1200 O3PipeView:issue:1300 O3PipeView:complete:1400 O3PipeView:retire:1500:store:0 -O3PipeView:fetch:2000:0x1004:0:2:sw x1, 0(a0):MemWrite +O3PipeView:fetch:2000:0x1004:0:2:sw x1, 0(a0) +uScopeView:usinfo:0:2:MemWrite O3PipeView:decode:2100 O3PipeView:rename:2150 O3PipeView:dispatch:2200 O3PipeView:issue:2300 O3PipeView:complete:2400 O3PipeView:retire:2500:store:0 -O3PipeView:fetch:3000:0x1008:0:3:lw x2, 0(a0):MemRead +O3PipeView:fetch:3000:0x1008:0:3:lw x2, 0(a0) +uScopeView:usinfo:0:3:MemRead O3PipeView:decode:3100 O3PipeView:rename:3150 O3PipeView:dispatch:3200 diff --git a/tests/test_flow.py b/tests/test_flow.py index 1d4e95b..120f215 100644 --- a/tests/test_flow.py +++ b/tests/test_flow.py @@ -74,7 +74,7 @@ def test_parse_deps(self, trace_with_deps): def test_parse_deps_before_fetch(self): parser = PipeViewParser() - parser.parse_line("O3PipeView:deps:0:2:1") + parser.parse_line("uScopeView:deps:0:2:1") assert parser.pending_producers[(0, 2)] == [1] parser.parse_line("O3PipeView:fetch:1000:0x1000:0:2:add x1,x2,x3:IntAlu") @@ -106,8 +106,8 @@ def test_parse_memdeps_merge(self, trace_with_deps_and_memdeps): def test_parse_memdeps_before_fetch(self): parser = PipeViewParser() - parser.parse_line("O3PipeView:deps:0:3:1") - parser.parse_line("O3PipeView:memdeps:0:3:2") + parser.parse_line("uScopeView:deps:0:3:1") + parser.parse_line("uScopeView:memdeps:0:3:2") assert parser.pending_producers[(0, 3)] == [1, 2] parser.parse_line("O3PipeView:fetch:3000:0x1008:0:3:lw x2,0(a0):MemRead") @@ -118,7 +118,7 @@ def test_parse_memdeps_before_fetch(self): def test_parse_memdeps_only(self): parser = PipeViewParser() - parser.parse_line("O3PipeView:memdeps:0:5:4") + parser.parse_line("uScopeView:memdeps:0:5:4") assert parser.pending_producers[(0, 5)] == [4] parser.parse_line("O3PipeView:fetch:1000:0x1000:0:5:lw x5,0(a0):MemRead") @@ -161,7 +161,7 @@ class TestConverterFlows: def test_interleaving(self, trace_with_deps, config: Config): parser = PipeViewParser() parser.parse_file(str(trace_with_deps)) - converter = ChromeTracingConverter(parser, config) + converter = ChromeTracingConverter(parser, config, data_flow=True) events = converter.convert() flow_s, flow_f = assert_flow_counts(events, 4) @@ -175,7 +175,7 @@ def test_interleaving(self, trace_with_deps, config: Config): def test_multiple_producers(self, trace_with_deps, config: Config): parser = PipeViewParser() parser.parse_file(str(trace_with_deps)) - converter = ChromeTracingConverter(parser, config) + converter = ChromeTracingConverter(parser, config, data_flow=True) events = converter.convert() flow_s, flow_f = assert_flow_counts(events, 4) @@ -187,7 +187,7 @@ def test_multiple_producers(self, trace_with_deps, config: Config): def test_cat_from_producer(self, trace_with_deps, config: Config): parser = PipeViewParser() parser.parse_file(str(trace_with_deps)) - converter = ChromeTracingConverter(parser, config) + converter = ChromeTracingConverter(parser, config, data_flow=True) events = converter.convert() flow_s = [e for e in events if e.get("ph") == "s"] @@ -202,15 +202,15 @@ def test_cat_from_producer(self, trace_with_deps, config: Config): def test_excluded_exec(self, trace_with_deps, config: Config): parser = PipeViewParser() parser.parse_file(str(trace_with_deps)) - converter = ChromeTracingConverter(parser, config, exclude_exec=True) + converter = ChromeTracingConverter(parser, config, data_flow=True, exclude_exec=True) events = converter.convert() assert not [e for e in events if e.get("ph") in ("s", "f")] - def test_exclude_flow_flag(self, trace_with_deps, config: Config): + def test_data_flow_default_off(self, trace_with_deps, config: Config): parser = PipeViewParser() parser.parse_file(str(trace_with_deps)) - converter = ChromeTracingConverter(parser, config, exclude_flow=True) + converter = ChromeTracingConverter(parser, config) events = converter.convert() assert not [e for e in events if e.get("ph") in ("s", "f")]