diff --git a/.cargo/config.toml b/.cargo/config.toml index 5bd4d4dc..1f2fe3e0 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,4 @@ [alias] interp = "run --quiet --offline --package protocols-interp --" -monitor = "run --quiet --offline --package protocols-monitor --" bi = "run --quiet --package bi --" parse = "run --quiet --package protocols-cli -- -p" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 368b971f..2c8549ae 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,8 +34,8 @@ jobs: run: runt runt/interp - name: Run Runt tests for graph-interpreter run: runt runt/graph_interp - - name: Run Runt tests for monitor - run: runt runt/monitor + - name: Run Runt tests for bi + run: runt runt/bi - name: Run Runt tests for waveform run: runt runt/waveform - name: Run Runt tests for fail @@ -120,30 +120,7 @@ jobs: - name: Use ruff (via uv) to format Python files # We pass in `--preview-features format` to suppress # uv's warning messages about the formatter being experimental - run: uv format --check --preview-features format - - # benchmark: - # name: Performance Benchmarks - # runs-on: ubuntu-24.04 - # timeout-minutes: 30 - - # steps: - # - uses: actions/checkout@v4 - # with: - # fetch-depth: 0 # Fetch all history to access baseline - # - uses: ./.github/actions/setup-test-environment - # with: - # github_token: ${{ secrets.GITHUB_TOKEN }} - # - name: Install hyperfine - # run: | - # wget https://github.com/sharkdp/hyperfine/releases/download/v1.19.0/hyperfine_1.19.0_amd64.deb - # sudo dpkg -i hyperfine_1.19.0_amd64.deb - # - name: Build monitor (release) - # run: cargo build --release --package protocols-monitor - # - name: Run benchmarks - # run: uv run scripts/benchmark_monitor.py - # - name: Check for performance regressions - # run: uv run scripts/check_performance_regression.py + run: uv format --check --preview-features format verilog: diff --git a/Cargo.toml b/Cargo.toml index 4378bc26..efa1c733 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "3" -members = ["bi", "interp", "monitor", "protocols", "cli", "graph-interp"] +members = ["bi", "interp", "protocols", "cli", "graph-interp"] [workspace.package] diff --git a/README.md b/README.md index f3dab58a..989fcad1 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,9 @@ A protocol is described using an `prot` definition containing a sequence of stat This repository contains: - An *interpreter* for the DSL -- A *monitor* tool, which given a specification of a hardware module's communication behavior (written in our DSL) +- A *backwards interpreter* (BI) tool, which given a specification of a hardware module's communication behavior (written in our DSL) and a `.fst` waveform file, infers a transaction-level trace that is consistent with the waveform data -- Common infrastructure shared between the interpreter & the monitor, such as a parser, type-checker and pretty-printer for our DSL +- Common infrastructure shared between the interpreter & the BI, such as a parser, type-checker and pretty-printer for our DSL These tools are all implemented in Rust, with some auxiliary benchmarking scripts written in Python. ## Installation + Build Instructions @@ -29,17 +29,7 @@ Note: the instructions below assume a macOS environment. - (Optional) Run `brew install hyperfine` to install [Hyperfine](https://github.com/sharkdp/hyperfine), a command-line benchmarking tool - Run `brew install just` to install [Just](https://github.com/casey/just), a command runner - Run `cargo install --git https://github.com/Nikil-Shyamsunder/runt.git` to install our fork of [Runt](https://github.com/rachitnigam/runt), a command-line tool we use for snapshot tests. Runt compares the output of our tools to expected outputs stored in dedicated files. - -**Dependencies for benchmarking the monitor**: - Run `uv sync` to install the Python dependencies specified in `pyproject.toml` -- Then, from the top-level directory, run the following scripts (note that they take ~3 minutes to run): -```bash -$ uv run scripts/benchmark_monitor.py -$ uv run scripts/plot_benchmark_results.py -``` -- This produces a CSV and a scatter plot measuring the performance of the monitor in - `benchmark_results/benchmark_results.csv` and `benchmark_results/benchmark_plot.png` respectively - - Some of the benchmarks correspond to real-world bugs taken from the [artifact for *Debugging in the Brave New World of Reconfigurable Hardware* (Ma et al. ASPLOS '22)](https://github.com/efeslab/asplos22-hardware-debugging-artifact) -- these can be found in the `tests/fpga-debugging` sub-directory (more details in the `README` of the sub-directories corresponding to each bug) @@ -49,43 +39,47 @@ $ uv run scripts/plot_benchmark_results.py **Building the source code**: - Run `cargo build` to build the Rust code - Run `just test` to execute all unit tests (`cargo test`) + snapshot tests (via Runt) - - To only run the subset of tests for the monitor, run `just monitor` - To generate HTML documentation, run `just doc` (this opens Cargo-generated docs in your browser) -## Monitor CLI -The CLI for the monitor can be used as follows: +## Backwards Interpreter CLI +The CLI for the BI can be used as follows: ```bash -$ cargo monitor --help +$ cargo bi --help +analyze signal traces to extract transactions -Usage: protocols-monitor [OPTIONS] --protocol --wave +Usage: bi [OPTIONS] --wave Options: -p, --protocol - Path to a Protocol (.prot) file + One or several protocol files. -w, --wave Path to a waveform trace (.fst, .vcd, .ghw) file -i, --instances ... - A mapping of DUT struct in the protocol file to an instance in the signal trace. Multiple arguments can be passed if they're seperated by whitespace. Format is: `${instance_name}:${dut_struct_name}` + A mapping of DUT struct in the protocol file to an instance in the signal trace. Can be used multiple times. Format is: `${instance_name}:${dut_struct_name} -v, --verbose... Increase logging verbosity -q, --quiet... Decrease logging verbosity - --color - To suppress colors in error messages, pass in `--color never` Otherwise, by default, error messages are displayed w/ ANSI colors [default: auto] [possible values: auto, always, never] - -d, --display-hex - If enabled, displays integer literals using hexadecimal notation --sample-posedge Optional argument which specifies the name of the signal to sample on a rising edge (posedge). If enabled, this flag acts as the "clock" signal for the monitor. Note: the full path to the signal should be passed as this argument, e.g. `uut_rx.clk`, where `uut_rx` is an instance in the signal trace - --show-waveform-time - If enabled, displays the start & end waveform time for each inferred transaction - --show-thread-ids - If enabled, displays the thread ID corresponding to each inferred transaction - --time-unit - Specifies the time unit for displaying waveform times. Can only be used with --show-waveform-time. Valid options: fs, ps, ns, us, ms, s, auto Default is 'auto' which selects the unit based on the maximum time in the waveform - --print-num-steps - Optional flag: if enabled, prints the no. of (logical) steps (i.e. clock cycles) taken by the montior --include-idle Optional flag: if enabled, always prints out idle transcations regardless of whether the protocol has been annotated with `#[idle]` + --show-steps + If enabled, displays the start & end step for each inferred transaction + --include-in-progress + This flag will make the bi append any in-progress transactions to the trace + --show-waveform-time + + --time-unit + + --max-traces + Limit the number of traces written to stdout + --color + To suppress colors in error messages, pass in `--color never`. Otherwise, by default, error messages are displayed with colors [default: auto] [possible values: auto, always, never] + -d, --display-hex + If enabled, displays integer literals using hexadecimal notation + -r, --rename ... + Rename pins of the DUT. &{field name in the struct} = ${verilog name} -h, --help Print help ``` @@ -93,7 +87,7 @@ Options: Example usage: ```bash $ cd tests -$ cargo monitor -p adders/add_d1.prot --wave adders/add_d1.fst --instances add_d1:Adder +$ cargo bi -p adders/add_d1.prot --wave adders/add_d1.fst --instances add_d1:Adder ``` ## Interpreter CLI diff --git a/benchmark_results/baseline_results.csv b/benchmark_results/baseline_results.csv deleted file mode 100644 index 25be40eb..00000000 --- a/benchmark_results/baseline_results.csv +++ /dev/null @@ -1,33 +0,0 @@ -file_path,test_name,num_steps,mean_per_step,stddev_per_step,min_per_step,max_per_step,steps_per_sec -monitor/tests/adders/add_d1.prot,add_d1,3,0.14875793053333333,0.006126195618268868,0.14195191666666668,0.15829109733333332,6.722330677865422 -monitor/tests/adders/add_d2.prot,add_d2,4,0.125136713575,0.01663598806858157,0.106305302,0.16327435425,7.991259890333107 -monitor/tests/alus/alu_d1.prot,alu_d1,6,0.08479561528333333,0.005089783504966598,0.076473361,0.091997868,11.793062608940714 -monitor/tests/alus/alu_d2.prot,alu_d2,7,0.06671416008571429,0.007254742149509938,0.05790981542857143,0.07599626185714285,14.989321588028702 -monitor/tests/brave_new_world_francis/bit_truncation_fft.prot,bit_truncation_fft,2,0.23601104785,0.024351858125364254,0.2008711665,0.2725409165,4.237089785032282 -monitor/tests/brave_new_world_francis/bit_truncation_sha.prot,bit_truncation_sha,2,0.22485540205000004,0.00970975540080263,0.2101191665,0.23957350000000002,4.447302537021702 -monitor/tests/brave_new_world_francis/ftu_sha.prot,ftu_sha,5,0.09479387414,0.010730857047385248,0.0812029082,0.1213028666,10.549204883462314 -monitor/tests/brave_new_world_francis/signal_async.prot,signal_async,4,0.11973648750000002,0.012270775808615969,0.10090861475,0.14023241675,8.351673085449411 -monitor/tests/brave_new_world_francis/use_without_valid.prot,use_without_valid,4,0.12223532915000002,0.019030568599586885,0.10200301025000001,0.16993876025000001,8.180940869990694 -monitor/tests/fifo/fifo.prot,fifo,7,0.07471902735714285,0.011858567918203744,0.05776523214285715,0.09260451185714287,13.38347185945273 -monitor/tests/fifo/push_pop_identity.prot,push_pop_identity,7,0.07313965772857142,0.007124680249118542,0.06392642271428571,0.08703029171428571,13.672473061209828 -monitor/tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot,c4_buggy,9,0.0571827926,0.0019631679881851097,0.054599301,0.05960237966666667,17.487778307630258 -monitor/tests/fpga-debugging/axis-fifo-d11/d11_buggy.prot,d11_buggy,14,0.03801793809285715,0.006364803708749545,0.026163267857142857,0.05120847321428572,26.30337283304381 -monitor/tests/fpga-debugging/axis-fifo-d11/d11_fixed.prot,d11_fixed,18,0.028343897683333334,0.002302835770616193,0.024919523166666666,0.03205006711111111,35.28096280801973 -monitor/tests/fpga-debugging/axis-fifo-d12/d12_buggy.prot,d12_buggy,15,0.03173991666666667,0.0031241106612165124,0.0272520944,0.035241525,31.50606885651348 -monitor/tests/fpga-debugging/axis-fifo-d12/d12_fixed.prot,d12_fixed,16,0.027547558606250005,0.00170299246537205,0.025870976562500002,0.031336036500000004,36.30085752038729 -monitor/tests/fpga-debugging/axis-fifo-d4/d4_buggy.prot,d4_buggy,64,0.007444867057812501,0.0006232076179890596,0.00662125,0.008239565109375001,134.32073296065363 -monitor/tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot,d4_fixed,74,0.006796869031081082,0.0005187925012940971,0.006017109243243243,0.007463505635135136,147.1265659860661 -monitor/tests/identities/identity_d1.prot,identity_d1,2,0.22811124780000003,0.01845019705435232,0.19928956250000002,0.25774939550000003,4.383825916715712 -monitor/tests/multi/multi0.prot,multi0,2,0.2633629458,0.033184983499937606,0.21690383300000002,0.311940125,3.7970413679964232 -monitor/tests/multi/multi0keep.prot,multi0keep,2,0.25359159585,0.05337954584344636,0.21414804150000002,0.39135025,3.9433483457847007 -monitor/tests/multi/multi0keep2const.prot,multi0keep2const,5,0.09422256754,0.0068852966639202234,0.08476453340000001,0.10302559180000001,10.61316865065764 -monitor/tests/multi/multi2const.prot,multi2const,5,0.08806364578,0.00866290978210808,0.0732284084,0.10405595000000001,11.355423581919299 -monitor/tests/multi/multi2multi.prot,multi2multi,2,0.22786470005000004,0.021745575730084246,0.19717664550000003,0.266391875,4.38856918066103 -monitor/tests/multi/multi_data.prot,multi_data,4,0.11820262190000001,0.010799799240563734,0.1012197395,0.1353747395,8.460049226708396 -monitor/tests/multipliers/mult_d2.prot,mult_d2,4,0.13533660727500002,0.011569700297392268,0.11749706250000001,0.15447808325,7.388983809591364 -monitor/tests/picorv32/pcpi_mul_unsigned_mul.prot,pcpi_mul_unsigned_mul,150,0.003487208360666666,0.00020565603513011122,0.0031455255533333333,0.0037856022200000003,286.76233151976766 -monitor/tests/serv/serv_regfile.prot,serv_regfile,71,0.00756163045915493,0.0007525393297573979,0.006874832169014085,0.009002170774647888,132.24661075433693 -monitor/tests/tinyaes128/aes128.prot,aes128,23,0.022402877539130433,0.003273676371797421,0.01868655252173913,0.030728077913043484,44.63712298803268 -monitor/tests/wal/advanced/axis.prot,axis,1874,0.00047715058916755597,7.326208750458896e-05,0.00040384765208110996,0.0005918900522945571,2095.77442153978 -monitor/tests/wal/advanced/axis_minimal.prot,axis_minimal,179,0.0026242541435754193,0.0003474431563772878,0.0022224466927374302,0.0032717008826815643,381.0606539188115 -monitor/tests/wal/advanced/axis_truncated.prot,axis_truncated,541,0.0009323496532347504,6.009876184702381e-05,0.0008184909112754159,0.0009964992310536045,1072.5589874255215 diff --git a/benchmark_results/benchmark_results.csv b/benchmark_results/benchmark_results.csv deleted file mode 100644 index 4d41903f..00000000 --- a/benchmark_results/benchmark_results.csv +++ /dev/null @@ -1,33 +0,0 @@ -file_path,test_name,num_steps,mean_per_step,stddev_per_step,min_per_step,max_per_step,steps_per_sec -monitor/tests/adders/add_d1.prot,add_d1,3,0.14875793053333333,0.006126195618268868,0.14195191666666668,0.15829109733333332,6.722330677865422 -monitor/tests/adders/add_d2.prot,add_d2,4,0.125136713575,0.01663598806858157,0.106305302,0.16327435425,7.991259890333107 -monitor/tests/alus/alu_d1.prot,alu_d1,6,0.08479561528333333,0.005089783504966598,0.076473361,0.091997868,11.793062608940714 -monitor/tests/alus/alu_d2.prot,alu_d2,7,0.06671416008571429,0.007254742149509938,0.05790981542857143,0.07599626185714285,14.989321588028702 -monitor/tests/brave_new_world_francis/bit_truncation_fft.prot,bit_truncation_fft,2,0.23601104785,0.024351858125364254,0.2008711665,0.2725409165,4.237089785032282 -monitor/tests/brave_new_world_francis/bit_truncation_sha.prot,bit_truncation_sha,2,0.22485540205000004,0.00970975540080263,0.2101191665,0.23957350000000002,4.447302537021702 -monitor/tests/brave_new_world_francis/ftu_sha.prot,ftu_sha,5,0.09479387414,0.010730857047385248,0.0812029082,0.1213028666,10.549204883462314 -monitor/tests/brave_new_world_francis/signal_async.prot,signal_async,4,0.11973648750000002,0.012270775808615969,0.10090861475,0.14023241675,8.351673085449411 -monitor/tests/brave_new_world_francis/use_without_valid.prot,use_without_valid,4,0.12223532915000002,0.019030568599586885,0.10200301025000001,0.16993876025000001,8.180940869990694 -monitor/tests/fifo/fifo.prot,fifo,7,0.07471902735714285,0.011858567918203744,0.05776523214285715,0.09260451185714287,13.38347185945273 -monitor/tests/fifo/push_pop_identity.prot,push_pop_identity,7,0.07313965772857142,0.007124680249118542,0.06392642271428571,0.08703029171428571,13.672473061209828 -monitor/tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot,c4_buggy,9,0.0571827926,0.0019631679881851097,0.054599301,0.05960237966666667,17.487778307630258 -monitor/tests/fpga-debugging/axis-fifo-d11/d11_buggy.prot,d11_buggy,14,0.03801793809285715,0.006364803708749545,0.026163267857142857,0.05120847321428572,26.30337283304381 -monitor/tests/fpga-debugging/axis-fifo-d11/d11_fixed.prot,d11_fixed,18,0.028343897683333334,0.002302835770616193,0.024919523166666666,0.03205006711111111,35.28096280801973 -monitor/tests/fpga-debugging/axis-fifo-d12/d12_buggy.prot,d12_buggy,15,0.03173991666666667,0.0031241106612165124,0.0272520944,0.035241525,31.50606885651348 -monitor/tests/fpga-debugging/axis-fifo-d12/d12_fixed.prot,d12_fixed,16,0.027547558606250005,0.00170299246537205,0.025870976562500002,0.031336036500000004,36.30085752038729 -monitor/tests/fpga-debugging/axis-fifo-d4/d4_buggy.prot,d4_buggy,64,0.007444867057812501,0.0006232076179890596,0.00662125,0.008239565109375001,134.32073296065363 -monitor/tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot,d4_fixed,74,0.006796869031081082,0.0005187925012940971,0.006017109243243243,0.007463505635135136,147.1265659860661 -monitor/tests/identities/identity_d1.prot,identity_d1,2,0.22811124780000003,0.01845019705435232,0.19928956250000002,0.25774939550000003,4.383825916715712 -monitor/tests/multi/multi0.prot,multi0,2,0.2633629458,0.033184983499937606,0.21690383300000002,0.311940125,3.7970413679964232 -monitor/tests/multi/multi0keep.prot,multi0keep,2,0.25359159585,0.05337954584344636,0.21414804150000002,0.39135025,3.9433483457847007 -monitor/tests/multi/multi0keep2const.prot,multi0keep2const,5,0.09422256754,0.0068852966639202234,0.08476453340000001,0.10302559180000001,10.61316865065764 -monitor/tests/multi/multi2const.prot,multi2const,5,0.08806364578,0.00866290978210808,0.0732284084,0.10405595000000001,11.355423581919299 -monitor/tests/multi/multi2multi.prot,multi2multi,2,0.22786470005000004,0.021745575730084246,0.19717664550000003,0.266391875,4.38856918066103 -monitor/tests/multi/multi_data.prot,multi_data,4,0.11820262190000001,0.010799799240563734,0.1012197395,0.1353747395,8.460049226708396 -monitor/tests/multipliers/mult_d2.prot,mult_d2,4,0.13533660727500002,0.011569700297392268,0.11749706250000001,0.15447808325,7.388983809591364 -monitor/tests/picorv32/pcpi_mul_unsigned_mul.prot,pcpi_mul_unsigned_mul,150,0.003487208360666666,0.00020565603513011122,0.0031455255533333333,0.0037856022200000003,286.76233151976766 -monitor/tests/serv/serv_regfile.prot,serv_regfile,71,0.00756163045915493,0.0007525393297573979,0.006874832169014085,0.009002170774647888,132.24661075433693 -monitor/tests/tinyaes128/aes128.prot,aes128,23,0.022402877539130433,0.003273676371797421,0.01868655252173913,0.030728077913043484,44.63712298803268 -monitor/tests/wal/advanced/axis.prot,axis,1874,0.00047715058916755597,7.326208750458896e-05,0.00040384765208110996,0.0005918900522945571,2095.77442153978 -monitor/tests/wal/advanced/axis_minimal.prot,axis_minimal,179,0.0026242541435754193,0.0003474431563772878,0.0022224466927374302,0.0032717008826815643,381.0606539188115 -monitor/tests/wal/advanced/axis_truncated.prot,axis_truncated,541,0.0009323496532347504,6.009876184702381e-05,0.0008184909112754159,0.0009964992310536045,1072.5589874255215 diff --git a/bi/src/bi.rs b/bi/src/bi.rs index dd3bad40..918e8d4d 100644 --- a/bi/src/bi.rs +++ b/bi/src/bi.rs @@ -632,11 +632,15 @@ impl Thread { } } Stmt::Fork => { - assert!(self.step > 0, "[{}] Cannot fork at step zero!", self.name); - self.has_forked = true; - self.next_stmt = ti.next_stmt[&stmt]; - self.effectful_stmt_in_step = true; - Fork + if self.step > 0 { + self.has_forked = true; + self.next_stmt = ti.next_stmt[&stmt]; + self.effectful_stmt_in_step = true; + Fork + } else { + eprintln!("[{}] Cannot fork at step zero!", self.name); + std::process::exit(1); + } } Stmt::While(cond, body) => { let cond_value = self diff --git a/bi/src/main.rs b/bi/src/main.rs index 046b7c26..1bffb6a3 100644 --- a/bi/src/main.rs +++ b/bi/src/main.rs @@ -76,6 +76,11 @@ struct Cli { #[arg(long)] max_traces: Option, + /// To suppress colors in error messages, pass in `--color never`. + /// Otherwise, by default, error messages are displayed with colors. + #[arg(long, value_name = "COLOR_CHOICE", default_value = "auto")] + color: ColorChoice, + /// If enabled, displays integer literals using hexadecimal notation #[arg(short, long, value_name = "DISPLAY_IN_HEX")] display_hex: bool, @@ -109,14 +114,20 @@ fn main() { // Parse CLI args let cli = Cli::parse(); - if let Some(tu) = cli.time_unit { - assert_eq!(tu, "ns", "Only nano seconds are supported"); + if let Some(tu) = cli.time_unit + && tu != "ns" + { + eprintln!( + "Only nano seconds are supported (received time unit {}). Exiting...", + tu + ); + return; } // parse protocol file let show_warnings = false; let skip_static_step_fork_checks = false; - let mut d = DiagnosticHandler::new(ColorChoice::Auto, false, show_warnings, false); + let mut d = DiagnosticHandler::new(cli.color, false, show_warnings, false); let (st, modules) = frontend(&cli.protocol, &mut d, skip_static_step_fork_checks).unwrap(); let posedge_clock = get_clock(&modules, cli.sample_posedge); diff --git a/bi/src/signal_trace.rs b/bi/src/signal_trace.rs index c4d078a1..d409eea5 100644 --- a/bi/src/signal_trace.rs +++ b/bi/src/signal_trace.rs @@ -373,6 +373,9 @@ impl StepToTime { TimescaleUnit::FemtoSeconds => format!("{}ns", time as f64 / 1000.0 / 1000.0), TimescaleUnit::PicoSeconds => format!("{}ns", time as f64 / 1000.0), TimescaleUnit::NanoSeconds => format!("{}ns", time), + TimescaleUnit::MicroSeconds => format!("{}ns", time as f64 * 1000.0), + TimescaleUnit::MilliSeconds => format!("{}ns", time as f64 * 1000.0 * 1000.0), + TimescaleUnit::Seconds => format!("{}ns", time as f64 * 1000.0 * 1000.0 * 1000.0), other => todo!("support {other:?}"), } } else { diff --git a/justfile b/justfile index db492b4a..ec43f4f5 100644 --- a/justfile +++ b/justfile @@ -1,8 +1,8 @@ # Runs the Runt snapshot suites that together cover every test runt: - cargo build --offline --package protocols-interp --package protocols-monitor --package graph-interp + cargo build --offline --package protocols-interp --package graph-interp --package bi runt --max-futures 1 runt/interp - runt --max-futures 1 runt/monitor + runt --max-futures 1 runt/bi runt --max-futures 1 runt/graph_interp runt --max-futures 1 runt/waveform runt --max-futures 1 runt/fail diff --git a/monitor/.gitignore b/monitor/.gitignore deleted file mode 100644 index bde1bbf8..00000000 --- a/monitor/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.vscode/ -tests/*.txt diff --git a/monitor/Cargo.toml b/monitor/Cargo.toml deleted file mode 100644 index 233acb68..00000000 --- a/monitor/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "protocols-monitor" -version = "0.1.0" -description = "analyze signal traces to extract transactions" -edition.workspace = true -rust-version.workspace = true -repository.workspace = true -license.workspace = true - -[dependencies] -protocols.workspace = true -clap = { version = "4.5.45", features = ["derive"] } -clap-verbosity-flag = "3.0.4" -env_logger = "0.11.8" -baa.workspace = true -patronus.workspace = true -wellen = "0.19.0" -log = "0.4.27" -stdext = "0.3" -rustc-hash.workspace = true -anyhow = "1.0.100" -# There are dependency issues if we use rand v0.10, so we pin rand to 0.9 for now -rand = "0.9" diff --git a/monitor/src/designs.rs b/monitor/src/designs.rs deleted file mode 100644 index e3d7811e..00000000 --- a/monitor/src/designs.rs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2025-26 Cornell University -// released under MIT License -// author: Kevin Laeufer -// author: Ernest Ng - -use protocols::frontend::Module; - -/// Concatenates all the names of `struct`s (`Design`s) into one single string -pub fn collects_module_names(duts: &[Module]) -> String { - let mut dut_names: Vec = duts.iter().map(|d| d.name.clone()).collect(); - dut_names.sort(); - dut_names.join(", ") -} - -pub struct Instance { - pub name: String, - #[allow(dead_code)] - module: String, - pub module_id: usize, -} - -/// Takes the contents of the `-i` CLI flag and tries to find -pub fn parse_instance(duts: &[Module], arg: &str) -> Instance { - let parts: Vec<&str> = arg.split(':').collect(); - match parts.as_slice() { - // `module` is the name of the design - // (In Verilog, "modules" are like interfaces and you have "instances" - // (concrete instantiations, aka implementations) of the module) - [inst, module] => { - if let Some(module_id) = duts.iter().position(|d| &d.name == module) { - Instance { - name: inst.to_string(), - module: module.to_string(), - module_id, - } - } else { - panic!( - "Unknown design {module} for instance {inst}. Did you mean {}?", - collects_module_names(duts) - ); - } - } - _ => panic!("unexpected instance argument: {arg}"), - } -} diff --git a/monitor/src/global_context.rs b/monitor/src/global_context.rs deleted file mode 100644 index 8a634e81..00000000 --- a/monitor/src/global_context.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2025 Cornell University -// released under MIT License -// author: Ernest Ng - -use crate::Cli; - -/// The `GlobalContext` stores fields which are common to all scheduler groups -/// (regardless of which `struct` they belong to), such as CLI configuration -/// flags. -/// Note: The `WaveSignalTrace` is owned by `GlobalScheduler` and passed -/// as needed. -#[derive(Clone)] -pub struct GlobalContext { - /// The name of the waveform file supplied by the user - /// (Only used for error-reporting purposes) - pub waveform_file: String, - - /// Indicates whether to print integer literals - /// using hexadecimal (if `false`, we default to using decimal). - pub display_hex: bool, - - /// Indicates whether to display the start & end waveform time for each - /// inferred transaction - pub show_waveform_time: bool, - - /// Indicates whether to print the no. of logical steps (i.e. clock cycles) - /// taken by the monitor - pub print_num_steps: bool, - - /// Indicates if there are multiple (more than 1) structs in the source file - pub multiple_structs: bool, - - /// Indicates whether to print out thread IDs for each inferred transaction - pub show_thread_ids: bool, - - /// Indicates whether to print out `idle` transactions (regardless of - /// whether they've been annotated with `#[idle]`) - pub include_idle: bool, - - /// If `Some(n)`, the monitor stops after processing `n` clock cycles. - /// Useful for quickly testing a protocol against the beginning of a - /// large waveform without waiting for the full trace to be processed. - pub max_steps: Option, -} - -impl GlobalContext { - /// Creates a new `GlobalContext` with - /// the configuration flags as specified by the user via the `Cli`. - /// The `display_hex` field indicates whether to print integer literals - /// in hexadecimal (if `false`, we default to using decimal). - /// Note: this function is meant to be called from `main.rs` only - /// upon monitor initialization. - pub fn new(cli: &Cli, multiple_structs: bool) -> Self { - Self { - waveform_file: cli.wave.clone(), - display_hex: cli.display_hex, - show_waveform_time: cli.show_waveform_time, - print_num_steps: cli.print_num_steps, - multiple_structs, - show_thread_ids: cli.show_thread_ids, - include_idle: cli.include_idle, - max_steps: cli.max_steps, - } - } -} diff --git a/monitor/src/global_scheduler.rs b/monitor/src/global_scheduler.rs deleted file mode 100644 index 86a1ef44..00000000 --- a/monitor/src/global_scheduler.rs +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright 2025 Cornell University -// released under MIT License -// author: Ernest Ng - -use std::collections::VecDeque; - -use rustc_hash::FxHashSet; - -use crate::global_context::GlobalContext; -use crate::scheduler::Scheduler; -use crate::signal_trace::{SignalTrace, StepResult, WaveSignalTrace}; -use crate::thread::Thread; -use crate::types::{ - AugmentedProtocolApplication, AugmentedTrace, CycleResult, SchedulerError, SchedulerGroup, - Trace, -}; - -pub struct GlobalScheduler { - /// A `Vec` of `SchedulerGroup`s, where each `SchedulerGroup` is a - /// collection of all schedulers for the same `struct` in our DSL. - /// Note that `SchedulerGroup` is defined as a type alias: - /// ``` - /// type SchedulerGroup = VecDeque - /// ``` - /// where each element in the `VecDeque` on the RHS is a scheduler clone - /// that is exploring a candidate transaction trace - pub scheduler_groups: Vec, - - /// The waveform supplied by the user (shared across all schedulers) - trace: WaveSignalTrace, -} - -/// Processes one clock cycle for all schedulers within the same scheduler group. -/// (See `types.rs` for the definition of a *scheduler group*) -/// Returns a `SchedulerGroup` of all schedulers that have been processed -/// for the current clock cycle. -/// The `other_groups` argument is only for error reporting purposes (printing -/// out the traces inferred by other scheduler groups, i.e. schedulers for -/// other `structs`) if the current scheduler group fails. -fn process_group_cycles( - scheduler_group: SchedulerGroup, - trace: &WaveSignalTrace, - ctx: &GlobalContext, - other_groups: &[&SchedulerGroup], -) -> anyhow::Result { - info!("Entered process_group_cycles function"); - - // We have to define this up here since we end up mutating `scheduler_group` - // later in this function - let group_was_non_empty = !scheduler_group.is_empty(); - - // BFS queue of schedulers (each scheduler represents the continuation - // of a possible protocol trace) - let mut last_failed_scheduler: Option = None; - let mut schedulers_to_process: SchedulerGroup = scheduler_group; - let mut processed_schedulers: SchedulerGroup = SchedulerGroup::new(); - - while let Some(mut scheduler) = schedulers_to_process.pop_front() { - match scheduler.process_current_queue(trace, ctx) { - Ok(CycleResult::Done) => { - processed_schedulers.push_back(scheduler); - } - Ok(CycleResult::Fork { parent }) => { - info!("Entered CycleResult::Fork branch"); - // When there is an explicit/implicit fork, - // we need to iterate over all possible candidate protocols - // and for each candidate protocol, spawn a scheduler that runs it - for transaction in &scheduler.possible_transactions { - let mut cloned_scheduler = scheduler.clone(); - - // If there was an explicit fork, we have to add the - // parent thread to the cloned scheduler's `current` queue. - if let Some(ref thread) = *parent { - cloned_scheduler.current.push_back(thread.clone()); - } - - // Create a new thread for the candidate protocol - let new_thread = Thread::new( - cloned_scheduler.struct_name.clone(), - transaction.clone(), - scheduler.symbol_table.clone(), - transaction.next_stmt_mapping(), - cloned_scheduler.num_threads, - cloned_scheduler.cycle_count, - trace.time_step(), - ); - cloned_scheduler.num_threads += 1; - cloned_scheduler.current.push_back(new_thread); - - // Continue processing the cloned scheduler - schedulers_to_process.push_back(cloned_scheduler); - } - } - Ok(CycleResult::RepeatLoopFork { - exited_thread, - speculative_thread, - }) => { - // For forks that arise due to `repeat` loops, - // create 2 schedulers that each execute a different thread: - // - One which executes the `exited_thread`, i.e. the thread - // which exits the loop with the `LoopArg` set to - // `Known(n)` for some `n >= 0` - // - One which executes the `speculative_thread`, i.e. - // the thread which speculatively executes the loop body - // for another iteration, with the `LoopArg` - // set to `Speculative(n + 1)` - - let mut scheduler_with_exited_thread = scheduler.clone(); - scheduler_with_exited_thread - .current - .push_back(*exited_thread); - schedulers_to_process.push_back(scheduler_with_exited_thread); - - let mut scheduler_with_speculative_thread = scheduler.clone(); - scheduler_with_speculative_thread - .current - .push_back(*speculative_thread); - schedulers_to_process.push_back(scheduler_with_speculative_thread); - } - Err(SchedulerError::NoTransactionsMatch { - struct_name, - error_context, - }) => { - info!("Entered NoTransactionsMatch branch"); - // This individual scheduler failed, so we discard it - // (Other schedulers in the scheduler group may still succeed) - info!( - "Error in scheduler for {}: {:#}", - struct_name, error_context - ); - last_failed_scheduler = Some(scheduler); - } - Err(SchedulerError::Other(err)) => { - info!("Entered OtherSchedulerError branch"); - // This individual scheduler failed; discard it. - info!("Scheduler error for `{}`: {:#}", scheduler.struct_name, err); - last_failed_scheduler = Some(scheduler); - } - } - } - - info!("Exited while-loop in process_group_cycles"); - - // If all schedulers that were processed can't make any more progress - // (i.e. both their `current` & `next` queues are empty, indicating - // there are no more threads to run in the current cycle nor the next cycle), - // and at least one scheduler failed in this cycle, then no scheduler in this - // group can produce a trace that is consistent with the waveform, - // so we emit an error. - let all_schedulers_done = processed_schedulers - .iter() - .all(|scheduler| scheduler.current.is_empty() && scheduler.next.is_empty()); - - info!("all_schedulers_done = {}", all_schedulers_done); - - if group_was_non_empty && all_schedulers_done { - info!("Entered if-statement at end of process_group_cycles"); - - info!( - "last_failed_scheduler.is_some() = {}", - last_failed_scheduler.is_some() - ); - - if let Some(failed_scheduler) = &last_failed_scheduler { - info!( - "All schedulers in the scheduler group for struct `{}` have been processed, - (all of them have no more threads to execute in the current/next cycle), - and there was at least one scheduler that failed, so emitting a global monitor failure", - failed_scheduler.struct_name - ); - eprintln!( - "All schedulers failed: No transactions match the waveform for DUT `{}`", - failed_scheduler.struct_name - ); - eprintln!( - "Trace inferred so far by failed scheduler:\n{}", - failed_scheduler - .output_buffer - .iter() - .map(|augmented_prot_app| { - let start_time = trace.format_time(augmented_prot_app.start_time_step); - let end_time = trace.format_time(augmented_prot_app.end_time_step); - format!( - "\t{}; // [time: {} -> {}]", - augmented_prot_app.protocol_application, start_time, end_time - ) - }) - .collect::>() - .join("\n") - ); - // Print the traces inferred by the other scheduler groups - // (for debugging purposes) - for other_group in other_groups { - if let Some(other_scheduler) = other_group.front() { - eprintln!( - "Trace inferred so far by scheduler for `{}`:\n{}", - other_scheduler.struct_name, - other_scheduler - .output_buffer - .iter() - .map(|augmented_prot_app| { - let start_time = - trace.format_time(augmented_prot_app.start_time_step); - let end_time = trace.format_time(augmented_prot_app.end_time_step); - format!( - "\t{}; // [time: {} -> {}]", - augmented_prot_app.protocol_application, start_time, end_time - ) - }) - .collect::>() - .join("\n") - ); - } - } - failed_scheduler.emit_error(trace, ctx)?; - } - } - - Ok(processed_schedulers) -} - -/// For a single scheduler group, collects all unique maximal traces -/// (deduplicated on canonical `ProtocolApplication` sequence, excluding idle, -/// with strict-prefix traces filtered out). -/// Returns the list of maximal `AugmentedProtocolApplication` traces for this group. -fn collect_maximal_traces(scheduler_group: &SchedulerGroup) -> Vec { - // Collect all unique traces, deduplicating on the canonical - // `ProtocolApplication` sequence (ignoring timing and thread IDs) - let mut all_entries: Vec = vec![]; - let mut seen_traces: FxHashSet = FxHashSet::default(); - - for scheduler in scheduler_group { - // Sort `AugmentedProtocolApplication`s by increasing cycle no. - let mut sorted_output_entries = scheduler.output_buffer.clone(); - sorted_output_entries.sort_by_key(|prot| prot.end_cycle_count); - - // Build canonical trace for dedup, excluding idle entries - let trace: Trace = sorted_output_entries - .iter() - .filter(|prot| !prot.is_idle) - .map(|prot| prot.protocol_application.clone()) - .collect(); - - // Only append `sorted_output_entries` to `all_entries` - // if it the corresponding `trace` wasn't previously in `seen_traces` - if seen_traces.insert(trace) { - all_entries.push(sorted_output_entries); - } - } - - // Filter out traces that are strict prefixes of other traces. - // These are partial traces from schedulers where a child thread failed - // but the parent thread completed successfully, - // resulting in a shorter trace. - let all_traces: Vec = all_entries - .iter() - .map(|augmented_trace| { - augmented_trace - .iter() - .filter(|prot| !prot.is_idle) - .map(|prot| prot.protocol_application.clone()) - .collect() - }) - .collect(); - - // Filter out traces which are strict prefixes of other traces. - // Call the remaining traces *maximal traces*. - let mut maximal_traces: Vec = all_entries - .into_iter() - .enumerate() - .filter(|(i, _)| { - !all_traces.iter().any(|other| { - other.len() > all_traces[*i].len() && other.starts_with(all_traces[*i].as_slice()) - }) - }) - .map(|(_, entries)| entries) - .collect(); - - // Keep only traces that reach the latest non-idle end cycle. - // This discards shorter maximal traces that do not cover as much - // of the waveform as competing candidates. - let max_end_cycle = maximal_traces - .iter() - .map(|trace| trace.max_non_idle_end_cycle()) - .max() - .unwrap_or(0); - maximal_traces.retain(|trace| trace.max_non_idle_end_cycle() == max_end_cycle); - - maximal_traces -} - -impl GlobalScheduler { - /// Pretty-prints a `trace { ... }` block to stdout - fn print_trace_block(trace_index: usize, lines: &[String]) { - println!("// trace {}", trace_index); - println!("trace {{"); - for line in lines { - println!(" {}", line); - } - println!("}}"); - } - - /// Creates an new `GlobalScheduler`. - /// Note: all the `Scheduler`s are expected to be initialized beforehand. - pub fn new(schedulers: Vec, trace: WaveSignalTrace) -> Self { - let scheduler_groups: Vec = schedulers - .into_iter() - .map(|s| VecDeque::from(vec![s])) - .collect(); - Self { - scheduler_groups, - trace, - } - } - - /// Prints all unique protocol traces across all scheduler groups. - /// (Recall that a scheduler group is just all schedulers corresponding - /// to the same `struct` in our DSL, where each scheduler is responsible - /// for exploring a possible candidate protocol trace.) - /// For multi-struct protocols, each struct's scheduler group is processed - /// independently during BFS, then the maximal (longest) trace from each - /// group is interleaved by cycle count at display time. - pub fn print_all_traces(&self, ctx: &GlobalContext) { - // Collect the maximal traces per scheduler group. - // The inner `Vec` represents the traces for all the schedulers - // for the same struct, while the outer `Vec` iterates over all - // possible `struct`s in the user-supplied `.prot` file. - let mut scheduler_group_traces: Vec> = self - .scheduler_groups - .iter() - .map(collect_maximal_traces) - .collect(); - - if scheduler_group_traces.is_empty() { - return; - } - - // Closure for deduplicating traces based on whether - // protocols have been annotated with `#[idle]` and if - // the monitor is in `include_idle` mode - let filter_key = - |prot_app: &AugmentedProtocolApplication| ctx.include_idle || !prot_app.is_idle; - - // For single-struct: show all unique traces directly - if scheduler_group_traces.len() == 1 { - // We call `swap_remove` to take ownership of - // `scheduler_group_traces[0]` without cloning. - // Since we only enter this branch when there's 1 element in - // `scheduler_group_traces`, calling `swap_remove` is OK - // (doesn't break functionality). - let traces: Vec = scheduler_group_traces.swap_remove(0); - for (i, trace) in traces.into_iter().enumerate() { - let lines: Vec = trace - .into_iter() - .filter(filter_key) - .map(|entry| self.format_augmented_protocol_application(&entry, ctx)) - .collect(); - if i > 0 { - println!(); - } - Self::print_trace_block(i, &lines); - } - return; - } - - // If we have multiple structs, pick the longest trace from each scheduler - // group. Interleave traces from each struct based on the cycle count in order. - let mut merged = AugmentedTrace::default(); - for group in scheduler_group_traces.into_iter() { - if let Some(longest) = group - .into_iter() - .max_by_key(|t| t.iter().filter(|&x| filter_key(x)).count()) - { - merged.extend(longest.clone()); - } - } - merged.sort_by_key(|entry| entry.end_cycle_count); - - // Format for stdout - let lines: Vec = merged - .into_iter() - .filter(filter_key) - .map(|entry| self.format_augmented_protocol_application(&entry, ctx)) - .collect(); - Self::print_trace_block(0, &lines); - } - - /// Formats an `AugmentedProtocolApplication` into a display string - fn format_augmented_protocol_application( - &self, - entry: &AugmentedProtocolApplication, - ctx: &GlobalContext, - ) -> String { - match (ctx.show_waveform_time, ctx.show_thread_ids) { - (true, true) | (true, false) => { - let start_time = self.trace.format_time(entry.start_time_step); - let end_time = self.trace.format_time(entry.end_time_step); - if ctx.show_thread_ids { - format!( - "{}; // [time: {} -> {}] (thread {})", - entry.protocol_application, start_time, end_time, entry.thread_id - ) - } else { - format!( - "{}; // [time: {} -> {}]", - entry.protocol_application, start_time, end_time - ) - } - } - (false, true) => format!( - "{}; // (thread {})", - entry.protocol_application, entry.thread_id - ), - (false, false) => format!("{};", entry.protocol_application), - } - } - - /// Runs all the schedulers in a round-robin fashion - pub fn run(&mut self, ctx: &GlobalContext) -> anyhow::Result<()> { - if self.scheduler_groups.is_empty() { - return Ok(()); - } - - let mut trace_ended = false; - let mut steps_taken: u32 = 0; - - loop { - for i in 0..self.scheduler_groups.len() { - // Begin cycle for each scheduler in this scheduler group - for scheduler in self.scheduler_groups[i].iter_mut() { - scheduler.begin_cycle(&self.trace); - } - - // Process each scheduler group and handle forks - let schedulers = std::mem::take(&mut self.scheduler_groups[i]); - let other_groups: Vec<&SchedulerGroup> = self - .scheduler_groups - .iter() - .enumerate() - .filter(|(j, _)| *j != i) - .map(|(_, g)| g) - .collect(); - let result = process_group_cycles(schedulers, &self.trace, ctx, &other_groups)?; - self.scheduler_groups[i] = result; - } - - // If we've reached the end of the trace, - // print the final state of each individual scheduler, - // then exit the loop - if trace_ended { - for scheduler_group in self.scheduler_groups.iter_mut() { - // Remove schedulers in the group - // whose candidate traces finish earlier - // than the maximum end-cycle observed across this group. - // (These are premature schedules that don't cover the entirety - // of the waveform) - let group_max_end_cycle = scheduler_group - .iter() - .map(|scheduler| scheduler.max_non_idle_end_cycle()) - .max() - .unwrap_or(0); - - scheduler_group.retain(|scheduler| { - let max_end_cycle = scheduler.max_non_idle_end_cycle(); - max_end_cycle == group_max_end_cycle - }); - - if let Some(scheduler) = scheduler_group.front() { - scheduler.print_step_count(ctx); - } - } - break; - } - - // Stop early if --max-steps was specified and we've hit the limit - steps_taken += 1; - if let Some(max) = ctx.max_steps - && steps_taken >= max - { - info!("GlobalScheduler: Reached --max-steps limit of {max}, stopping early"); - break; - } - - // Advance the trace (only once for all schedulers) - let step_result = self.trace.step(); - - // Advance all schedulers to their next cycle - for scheduler_group in self.scheduler_groups.iter_mut() { - for scheduler in scheduler_group.iter_mut() { - scheduler.advance_to_next_cycle(ctx, &self.trace); - } - } - - // Check if trace ended (if it finished, then we exit out the loop) - if let StepResult::Done = step_result { - info!("GlobalScheduler: No steps remaining in signal trace"); - // Mark all schedulers as having trace ended - for scheduler_group in self.scheduler_groups.iter_mut() { - for scheduler in scheduler_group.iter_mut() { - scheduler.mark_trace_ended(); - } - } - trace_ended = true; - } - } - - // No more threads to run in each of the schedulers - info!("Monitor finished!"); - - // Print all collected traces - self.print_all_traces(ctx); - - Ok(()) - } -} diff --git a/monitor/src/interpreter.rs b/monitor/src/interpreter.rs deleted file mode 100644 index 34b7a1e8..00000000 --- a/monitor/src/interpreter.rs +++ /dev/null @@ -1,1197 +0,0 @@ -use std::collections::hash_map::Entry; - -use baa::{BitVecMutOps, BitVecOps, BitVecValue}; -use protocols::errors::{ - AssertionError, EvaluationError, ExecutionError, ExecutionResult, SymbolError, -}; -use protocols::frontend::ast::{BinOp, Expr, ExprId, Protocol, Stmt, StmtId, UnaryOp}; -use protocols::frontend::serialize::{ - serialize_args_mapping, serialize_bitvec, serialize_expr, serialize_stmt, -}; -use protocols::frontend::symbol::{SymbolId, SymbolTable}; -use protocols::interpreter::ExprValue; -use protocols::scheduler::NextStmtMap; -use rustc_hash::FxHashMap; - -use crate::global_context::GlobalContext; -use crate::signal_trace::{PortKey, SignalTrace, WaveSignalTrace}; -use crate::thread::Thread; -use crate::types::{LoopArgState, ProtocolApplication}; - -#[allow(dead_code)] -#[derive(Clone)] -pub struct Interpreter { - pub transaction: Protocol, - pub symbol_table: SymbolTable, - pub next_stmt_map: NextStmtMap, - - /// Maps protocol arguments (input/output parameters) to their values - pub args_mapping: FxHashMap, - - /// Tracks which bits of a `SymbolId` are known - pub known_bits: FxHashMap, - - /// Tracks the state of arguments for `repeat` loops - pub loop_args: FxHashMap, - - /// Constraints on DUT input port values that must hold after stepping. - /// These are established by assignments like `D.m_axis_tvalid := 1'b1` - /// or assignments like `DUT.a := a`, - /// and checked after each `step()` to ensure the constraint still holds. - pub constraints: FxHashMap, - - /// The current cycle count in the trace - /// (This field is only used to make error messages more informative) - pub trace_cycle_count: u32, - - /// The `instance_id` of the DUT (which determines which `struct` - /// in our DSL for which we are inferring transactions). - /// This field is useful when we have a `.prot` file with multiple - /// `struct`s. - pub instance_id: u32, -} - -/// internal adapter to deal with the fact that the monitor does support sequence types and -/// all values are bit-vectors -pub(crate) fn serialize_monitor_args_mapping( - args_mapping: &FxHashMap, - symbol_table: &SymbolTable, - display_hex: bool, -) -> String { - let normalized_args = args_mapping - .iter() - .map(|(k, v)| (*k, v.clone().into())) - .collect(); - serialize_args_mapping(&normalized_args, symbol_table, display_hex) -} - -impl Interpreter { - /// Attempts to builds a `ProtocolApplication` from the current interpreter state. - /// `struct_name` is left as `None` — the caller (Scheduler) is responsible - /// for setting it, since the Interpreter doesn't know the struct name. - /// If this return function returns `None` (e.g. because an argument - /// wasn't present in `args_mapping`), the caller - /// (`Scheduler::run_thread_till_next_step`) treats the corresponding thread - /// as having failed. - pub fn to_protocol_application( - &self, - struct_name: Option, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> Option { - let mut serialized_args = vec![]; - for arg in &self.transaction.args { - let symbol_id = arg.symbol(); - if let Some(value) = self.args_mapping.get(&symbol_id) { - serialized_args.push(serialize_bitvec(value, ctx.display_hex)); - } else { - let name = self.symbol_table[symbol_id].full_name(&self.symbol_table); - let time_str = if ctx.show_waveform_time { - trace.format_time(trace.time_step()) - } else { - format!("cycle {}", self.trace_cycle_count) - }; - info!( - "Transaction `{}`, {}: Unable to find value for {} ({}) in args_mapping, which is {{ {} }}", - self.transaction.name, - time_str, - name, - symbol_id, - serialize_monitor_args_mapping( - &self.args_mapping, - &self.symbol_table, - ctx.display_hex - ) - ); - return None; - } - } - Some(ProtocolApplication { - struct_name, - protocol_name: self.transaction.name.clone(), - serialized_args, - }) - } - - /// Performs a context switch in the `Interpreter` by setting its - /// `Transaction`, `SymbolTable`, `args_mapping`, `known_bits`, and `constraints` - /// to the specified arguments - pub fn context_switch(&mut self, thread: &Thread) { - self.transaction = thread.transaction.clone(); - self.symbol_table = thread.symbol_table.clone(); - self.next_stmt_map = thread.next_stmt_map.clone(); - self.args_mapping = thread.args_mapping.clone(); - self.known_bits = thread.known_bits.clone(); - self.constraints = thread.constraints.clone(); - self.loop_args = thread.loop_args_state.clone(); - } - - /// Pretty-prints a `Statement` identified by its `StmtId` - /// with respect to the current `SymbolTable` associated with this `Evaluator` - pub fn format_stmt(&self, stmt_id: &StmtId) -> String { - self.transaction.format_stmt(stmt_id, &self.symbol_table) - } - - /// Pretty-prints a `Expr` identified by its `ExprID` - /// with respect to the current `SymbolTable` associated with this `Evaluator` - pub fn format_expr(&self, expr_id: &ExprId) -> String { - self.transaction.format_expr(expr_id, &self.symbol_table) - } - - /// Creates a new Interpreter for a given `Transaction` - pub fn new( - transaction: Protocol, - symbol_table: SymbolTable, - trace: &WaveSignalTrace, - trace_cycle_count: u32, - instance_id: u32, - ) -> Self { - let mut args_mapping = FxHashMap::default(); - let mut known_bits = FxHashMap::default(); - - for port_key in trace.port_map.keys() { - // We assume that there is only one `Instance` at the moment - let PortKey { - instance_id, - pin_id, - } = port_key; - - // Fetch the current value of the `pin_id` - // (along with the name of the corresponding `Field`) - let current_value = trace.get(*instance_id, *pin_id).unwrap_or_else(|err| { - panic!( - "Unable to get value for pin {pin_id} in signal trace, {:?}", - err - ) - }); - let bitwidth = current_value.width(); - args_mapping.insert(*pin_id, current_value); - - // Insert a bitstring of all `1`s into `known_bits`, - // with length equal to the bit-width of `current_value` - known_bits.insert(*pin_id, BitVecValue::ones(bitwidth)); - } - - Self { - transaction: transaction.clone(), - symbol_table, - next_stmt_map: transaction.next_stmt_mapping(), - args_mapping, - known_bits, - constraints: FxHashMap::default(), - trace_cycle_count, - loop_args: FxHashMap::default(), - instance_id, - } - } - - /// Evaluates an `Expr` identified by its `ExprId`, returning an `ExprValue` - fn evaluate_expr( - &mut self, - expr_id: &ExprId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult { - let transaction = self.transaction.clone(); - let expr = &transaction[expr_id]; - match expr { - Expr::Const(bit_vec) => Ok(ExprValue::Concrete(bit_vec.clone())), - Expr::Sym(sym_id) => { - let name = self.symbol_table[sym_id].full_name(&self.symbol_table); - - // First check if the symbol is in args_mapping - // (the symbol corresponds to a parameter to the transaction) - if let Some(value) = self.args_mapping.get(sym_id) { - Ok(ExprValue::Concrete(value.clone())) - } - // Otherwise, try to fetch the value from the trace - else if let Ok(value) = trace.get(self.instance_id, *sym_id) { - if ctx.show_waveform_time { - info!( - "Trace @ time {}: `{}` has value {}", - trace.format_time(trace.time_step()), - name, - serialize_bitvec(&value, ctx.display_hex) - ); - } else { - info!( - "Trace @ cycle {}: `{}` has value {}", - self.trace_cycle_count, - name, - serialize_bitvec(&value, ctx.display_hex) - ); - } - - // TODO: what is this code actually supposed to do? - // // Check if the symbol we're referring to - // // is the DUT pin corresponding to an output parameter - // - // // Concretely, we check if the identifier begins with - // // the name of the DUT (e.g. check if "DUT.s" begins with "DUT.") - // let dut_prefix = format!("{}.", self.symbol_table[self.dut_symbol_id].name()); - // if name.starts_with(&dut_prefix) { - // let pin_name = &name[dut_prefix.len()..]; - // - // // Find if there's an output parameter with this name - // // that hasn't been added to the `args_mapping` yet - // for arg in &self.transaction.args { - // let param_name = self.symbol_table[arg.symbol()].name(); - // if param_name == pin_name - // && !self.args_mapping.contains_key(&arg.symbol()) - // { - // // If yes, we read the value for the corresponding - // // DUT pin from the trace, and update the args_mapping - // // so that ` |-> ` - // info!( - // "Capturing output parameter {} = {}", - // param_name, - // serialize_bitvec(&value, ctx.display_hex) - // ); - // self.args_mapping.insert(arg.symbol(), value.clone()); - // - // break; - // } - // } - // } - Ok(ExprValue::Concrete(value)) - } else { - info!( - "args_mapping: \n{}", - serialize_monitor_args_mapping( - &self.args_mapping, - &self.symbol_table, - ctx.display_hex - ) - ); - - Err(ExecutionError::symbol_not_found( - *sym_id, - name.to_string(), - "args_mapping or trace".to_string(), - *expr_id, - )) - } - } - Expr::DontCare => Ok(ExprValue::DontCare), - Expr::Binary(bin_op, lhs_id, rhs_id) => { - let lhs_val = self.evaluate_expr(lhs_id, ctx, trace)?; - let rhs_val = self.evaluate_expr(rhs_id, ctx, trace)?; - match bin_op { - BinOp::Equal => match (&lhs_val, &rhs_val) { - (ExprValue::DontCare, _) | (_, ExprValue::DontCare) => { - Err(ExecutionError::dont_care_operation( - "equality".to_string(), - "binary expression".to_string(), - *expr_id, - )) - } - (ExprValue::Concrete(lhs), ExprValue::Concrete(rhs)) => { - if lhs.width() != rhs.width() { - Err(ExecutionError::arithmetic_error( - "Equal".to_string(), - format!( - "Width mismatch in EQUAL operation: lhs width = {}, rhs width = {}", - lhs.width(), - rhs.width() - ), - *expr_id, - )) - } else if lhs == rhs { - Ok(ExprValue::Concrete(BitVecValue::new_true())) - } else { - Ok(ExprValue::Concrete(BitVecValue::new_false())) - } - } - }, - BinOp::Concat => match (&lhs_val, &rhs_val) { - (ExprValue::DontCare, _) | (_, ExprValue::DontCare) => { - Err(ExecutionError::dont_care_operation( - "CONCAT".to_string(), - "binary expression".to_string(), - *expr_id, - )) - } - (ExprValue::Concrete(lhs), ExprValue::Concrete(rhs)) => { - if lhs.width() != rhs.width() { - Err(ExecutionError::arithmetic_error( - "Concat".to_string(), - format!( - "Width mismatch in CONCAT operation: lhs width = {}, rhs width = {}", - lhs.width(), - rhs.width() - ), - *expr_id, - )) - } else { - Ok(ExprValue::Concrete(lhs.concat(rhs))) - } - } - }, - BinOp::Add => todo!("add support for `add`"), - BinOp::And => todo!("and support for `and`"), - } - } - Expr::Unary(unary_op, expr_id) => { - let expr_val = self.evaluate_expr(expr_id, ctx, trace)?; - match expr_val { - ExprValue::Concrete(bvv) => match unary_op { - UnaryOp::Not => Ok(ExprValue::Concrete(bvv.not())), - }, - ExprValue::DontCare => Err(ExecutionError::dont_care_operation( - "unary operation".to_string(), - "unary expression".to_string(), - *expr_id, - )), - } - } - Expr::Slice(sliced_expr_id, msb, lsb) => { - let sliced_expr = &self.transaction[sliced_expr_id]; - - // Before evaluating the slice, we first need to - // check whether all bits in the slice are currently known - // (i.e. are set to 1 in `self.known_bits`) - // Note: we only do this for the function's (output) parameters - // (i.e. if `sliced_symbol_id` has *no* parent in the `SymbolTable`) - // We don't do this for DUT (output) ports, since if they are - // mentioned in `assert_eq`, we can just read them from the trace - if let Expr::Sym(sliced_symbol_id) = sliced_expr { - if self.symbol_table[sliced_symbol_id].parent().is_none() { - let symbol_name = self.symbol_table[sliced_symbol_id].name(); - - // Check whether `[msb:lsb]` are all 1s in the - // known-bits map - if let Some(known_bits) = self.known_bits.get(sliced_symbol_id) { - let all_bits_known_in_slice = - (*lsb..=*msb).all(|idx| known_bits.is_bit_set(idx)); - if !all_bits_known_in_slice { - // Some bits in the slice are not known yet, - // so we report an error - return Err(ExecutionError::symbol_not_found( - *sliced_symbol_id, - symbol_name.to_string(), - format!( - "known_bits (some bits in slice {}[{}:{}] are not yet known)", - symbol_name, msb, lsb - ), - *sliced_expr_id, - )); - } - } else { - // Report an error since we are trying to slice - // a `symbol_id` where the provenance of the bits - // is unknown (i.e. it is absent from `self.known_bits`) - return Err(ExecutionError::symbol_not_found( - *sliced_symbol_id, - symbol_name.to_string(), - "known_bits".to_string(), - *sliced_expr_id, - )); - } - } - } else { - return Err(ExecutionError::illegal_slice(*sliced_expr_id, *msb, *lsb)); - } - - let expr_val = self.evaluate_expr(sliced_expr_id, ctx, trace)?; - match expr_val { - ExprValue::Concrete(bvv) => { - let width = bvv.width(); - // Check whether `msb` & `lsb` are in bounds - if *msb < width && *lsb <= *msb { - Ok(ExprValue::Concrete(bvv.slice(*msb, *lsb))) - } else { - Err(ExecutionError::invalid_slice( - *sliced_expr_id, - *msb, - *lsb, - width, - )) - } - } - ExprValue::DontCare => Err(ExecutionError::dont_care_operation( - "slice".to_string(), - "slice expression".to_string(), - *sliced_expr_id, - )), - } - } - Expr::IsLastIteration => todo!("add support for is_last() expression"), - Expr::IterCount(_) => todo!("add support for iter_count() expression"), - } - } - - /// Helper function to map an output parameter of a function (`out_param_symbol`) - /// to the trace value for `trace_symbol`. This function checks - /// if `trace_symbol` exists in the trace and `out_param_symbol` is - /// currently *not* in the `args_mapping`. If so, it - /// adds a mapping from `out_param_symbol` to the trace value. - /// - /// Other arguments: - /// - `out_param_name` & `trace_symbol_name` - /// are the full (string) names corresponding to the two symbols - /// respectively. - /// - `trace_symbol_expr_id` is the `ExprId` of `trace_symbol` (this is - /// only used to enable more precise error message locations) - fn map_output_param_to_trace( - &mut self, - out_param_symbol: SymbolId, - trace_symbol: SymbolId, - trace_symbol_expr_id: ExprId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult<()> { - if let Ok(value) = trace.get(self.instance_id, trace_symbol) { - // Only modify the args_mapping if `out_param_symbol` - // is currently *not* present - // (Clippy suggested checking if the `Entry` is `Vacant` - // instead of using `contains_key` + `insert`) - if let Entry::Vacant(e) = self.args_mapping.entry(out_param_symbol) { - e.insert(value.clone()); - let out_param_name = self - .symbol_table - .full_name_from_symbol_id(&out_param_symbol); - info!( - "Extended args_mapping with {} |-> {}", - out_param_name, - serialize_bitvec(&value, ctx.display_hex) - ); - repeat_info!( - "Output param {} = {} (read from trace at cycle {})", - out_param_name, - serialize_bitvec(&value, ctx.display_hex), - self.trace_cycle_count - ); - Ok(()) - } else { - // If `out_param_symbol` is already in the `args_mapping`, - // we do nothing (we don't want to overwrite existing - // key-value bindings) - Ok(()) - } - } else { - info!( - "args_mapping: \n{}", - serialize_monitor_args_mapping( - &self.args_mapping, - &self.symbol_table, - ctx.display_hex - ) - ); - - let trace_symbol_name = self.symbol_table.full_name_from_symbol_id(&trace_symbol); - Err(ExecutionError::symbol_not_found( - trace_symbol, - trace_symbol_name, - "trace".to_string(), - trace_symbol_expr_id, - )) - } - } - - /// Evaluates a `Statement` identified by its `StmtId`, - /// returning the `StmtId` of the next statement to evaluate (if one exists) - pub fn evaluate_stmt( - &mut self, - stmt_id: &StmtId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult> { - let transaction = self.transaction.clone(); - let stmt = &transaction[stmt_id]; - info!( - "Examining statement `{}` ({})", - serialize_stmt(&self.transaction, &self.symbol_table, stmt_id), - stmt_id - ); - match stmt { - Stmt::Assign(symbol_id, expr_id) => { - self.evaluate_assign(symbol_id, expr_id, ctx, trace)?; - Ok(self.next_stmt_map[stmt_id]) - } - Stmt::IfElse(cond_expr_id, then_stmt_id, else_stmt_id) => { - self.evaluate_if(cond_expr_id, then_stmt_id, else_stmt_id, ctx, trace) - } - Stmt::While(loop_guard_id, do_block_id) => { - self.evaluate_while(loop_guard_id, stmt_id, do_block_id, ctx, trace) - } - Stmt::RepeatLoop(_, _) => { - // Repeat loops are intercepted in `run_thread_till_next_step` - // in `scheduler.rs`, so this case is unreachable - unreachable!("Repeat loops handled in `scheduler.rs` already") - } - Stmt::ForInLoop(_, _, _) => todo!("add support for for-in loops"), - Stmt::Step | Stmt::Fork => { - // The scheduler handles `step`s and `fork`s. - // Here, we simply return the next statement to run - Ok(self.next_stmt_map[stmt_id]) - } - Stmt::AssertEq(expr_id1, expr_id2) => { - self.evaluate_assert_eq(stmt_id, expr_id1, expr_id2, ctx, trace) - } - Stmt::Block(stmt_ids) => { - if stmt_ids.is_empty() { - Ok(None) - } else { - Ok(Some(stmt_ids[0])) - } - } - } - } - - /// Evaluates an `assert_eq` statement identified by `stmt_id`, - /// where `expr_id1` & `expr_id2` refer to the two arguments (expressions) - /// supplied to `assert_eq` - fn evaluate_assert_eq( - &mut self, - stmt_id: &StmtId, - expr_id1: &ExprId, - expr_id2: &ExprId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult> { - let e1 = &self.transaction[expr_id1]; - let e2 = &self.transaction[expr_id2]; - match (e1, e2) { - // If the two args to `assert_eq`s are both identifiers, - // one of them is an output param of the transaction, - // & the other is a DUT output port - (Expr::Sym(symbol_id1), Expr::Sym(symbol_id2)) => { - // We deference the two `SymbolId`s in order to - // avoid borrow-checker issues here - let symbol_id1 = *symbol_id1; - let symbol_id2 = *symbol_id2; - - let name1 = self.symbol_table.full_name_from_symbol_id(&symbol_id1); - let name2 = self.symbol_table.full_name_from_symbol_id(&symbol_id2); - - let params: Vec<_> = self.transaction.args.iter().map(|a| a.symbol()).collect(); - for param_symbol in params { - if param_symbol == symbol_id1 { - info!("{} is an output param of the transaction", name1); - self.map_output_param_to_trace( - symbol_id1, symbol_id2, *expr_id2, ctx, trace, - )?; - } else if param_symbol == symbol_id2 { - info!("{} is an output param of the transaction", name2); - self.map_output_param_to_trace( - symbol_id2, symbol_id1, *expr_id1, ctx, trace, - )?; - } - } - Ok(self.next_stmt_map[stmt_id]) - } - (_, _) => { - // Handle other exprs that are supplied to `assert_eq` - // e.g. bit-slices - - let eval_result1 = self.evaluate_expr(expr_id1, ctx, trace); - let eval_result2 = self.evaluate_expr(expr_id2, ctx, trace); - - match (eval_result1.clone(), eval_result2.clone()) { - ( - Ok(ExprValue::Concrete(value1)), - Err(ExecutionError::Symbol(SymbolError::NotFound { .. })), - ) => { - self.infer_value_from_assertion(expr_id2, expr_id1, &value1, ctx)?; - Ok(self.next_stmt_map[stmt_id]) - } - ( - Err(ExecutionError::Symbol(SymbolError::NotFound { .. })), - Ok(ExprValue::Concrete(value2)), - ) => { - self.infer_value_from_assertion(expr_id1, expr_id2, &value2, ctx)?; - Ok(self.next_stmt_map[stmt_id]) - } - // Check whether the two arguments to the assertion are equal - (Ok(ExprValue::Concrete(value1)), Ok(ExprValue::Concrete(value2))) => { - if value1 != value2 { - info!( - "Assertion `{}` failed: {} != {}", - self.format_stmt(stmt_id), - serialize_bitvec(&value1, ctx.display_hex), - serialize_bitvec(&value2, ctx.display_hex), - ); - Err(ExecutionError::Assertion(AssertionError::EqualityFailed { - expr1_id: *expr_id1, - expr2_id: *expr_id2, - value1, - value2, - })) - } else { - info!("Assertion `{}` passed", self.format_stmt(stmt_id),); - Ok(self.next_stmt_map[stmt_id]) - } - } - - // For other cases, we skip the assertion for now - (Ok(_), Ok(_)) => { - info!( - "Skipping assertion `{}` ({})", - self.format_stmt(stmt_id), - stmt_id - ); - Ok(self.next_stmt_map[stmt_id]) - } - _ => { - if eval_result1.is_err() { - info!("{} is ???", self.format_expr(expr_id1)) - } - if eval_result2.is_err() { - info!("{} is ???", self.format_expr(expr_id2)) - } - info!( - "Skipping assertion `{}` ({})", - self.format_stmt(stmt_id), - stmt_id - ); - Ok(self.next_stmt_map[stmt_id]) - } - } - } - } - } - - /// Infers the value of an unknown expression from an assertion, - /// and inserts a binding for it into the `args_mapping`. - /// - `unknown_expr_id` is the expr whose value we're inferring - /// - `known_expr_id` is the (known) expr with value `known_value` - fn infer_value_from_assertion( - &mut self, - unknown_expr_id: &ExprId, - known_expr_id: &ExprId, - known_value: &BitVecValue, - ctx: &GlobalContext, - ) -> ExecutionResult<()> { - let unknown_expr = &self.transaction[unknown_expr_id]; - - match unknown_expr { - Expr::Slice(sliced_expr_id, msb, lsb) => { - let sliced_expr = &self.transaction[sliced_expr_id]; - match sliced_expr { - Expr::Sym(sliced_symbol_id) => { - let symbol_name = - self.symbol_table[sliced_symbol_id].full_name(&self.symbol_table); - info!( - "Inferring value for `{}[{}:{}]` from assertion with `{}`", - symbol_name, - msb, - lsb, - self.format_expr(known_expr_id) - ); - - // Get the expected width from the symbol's type - let expected_width = self.symbol_table[sliced_symbol_id].tpe().bitwidth(); - - // If `sliced_symbol_id` isn't in either of - // `args_mapping` or `known_bits`, map it to the - // bit-vector of all zeroes - self.args_mapping - .entry(*sliced_symbol_id) - .or_insert_with(|| BitVecValue::zero(expected_width)); - self.known_bits - .entry(*sliced_symbol_id) - .or_insert_with(|| BitVecValue::zero(expected_width)); - - // Get the current value and known_bits - let mut current_value = self.args_mapping[sliced_symbol_id].clone(); - let mut known_bits = self.known_bits[sliced_symbol_id].clone(); - - // Update bits `[msb:lsb]` w/ the known value - for i in 0..=(msb - lsb) { - let bit_pos = lsb + i; - if known_value.is_bit_set(i) { - current_value.set_bit(bit_pos); - } else { - current_value.clear_bit(bit_pos); - } - // Mark this bit as known - known_bits.set_bit(bit_pos); - } - - // Update `args_mapping` and `known_bits` to point - // to the updated values & known bits - self.args_mapping - .insert(*sliced_symbol_id, current_value.clone()); - self.known_bits - .insert(*sliced_symbol_id, known_bits.clone()); - - info!( - "Updated args_mapping: {} |-> {} (0b{})", - symbol_name, - serialize_bitvec(¤t_value, ctx.display_hex), - current_value.to_bit_str() - ); - info!( - "Updated known_bits: {} |-> {}", - symbol_name, - known_bits.to_bit_str() - ); - - Ok(()) - } - _ => Ok(()), - } - } - Expr::Sym(symbol_id) => { - // Fetch all the parameters of the function - let params: Vec<_> = self.transaction.args.iter().map(|a| a.symbol()).collect(); - - let param_strs = params - .iter() - .map(|symbol_id| self.symbol_table[symbol_id].name().to_string()) - .collect::>() - .join(", "); - info!("out_params = {}", param_strs); - - // If `symbol_id` is an output parameter that is currently - // absent from `args_mapping`, insert the binding - // `symbol_id |-> known_value` into `args_mapping`, - // and update `known_bits` to be all ones - if params.contains(symbol_id) { - let symbol_name = self.symbol_table[symbol_id].full_name(&self.symbol_table); - - info!("Identified {} as an output parameter", symbol_name); - - if let Entry::Vacant(e) = self.args_mapping.entry(*symbol_id) { - e.insert(known_value.clone()); - let width = known_value.width(); - self.known_bits.insert(*symbol_id, BitVecValue::ones(width)); - info!( - "Extended args_mapping with {} |-> {}", - symbol_name, - serialize_bitvec(known_value, ctx.display_hex) - ); - } - } - Ok(()) - } - _ => Ok(()), - } - } - - /// Evaluates an `if`-statement, returning the `StmtId` of the next - /// statement to evaluate (if one exists) - fn evaluate_if( - &mut self, - cond_expr_id: &ExprId, - then_stmt_id: &StmtId, - else_stmt_id: &StmtId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult> { - let res = self.evaluate_expr(cond_expr_id, ctx, trace)?; - match res { - ExprValue::DontCare => Err(ExecutionError::invalid_condition( - "if".to_string(), - *cond_expr_id, - )), - ExprValue::Concrete(bvv) => { - if bvv.is_zero() { - Ok(Some(*else_stmt_id)) - } else { - Ok(Some(*then_stmt_id)) - } - } - } - } - /// When the monitor encounters an assignment of the form `lhs_symbol_id := rhs_expr_id`, - /// e.g. `DUT.a := a` (where `stmt_id` is the `StmtId` of the assignment): - /// 1. It first tries to evaluate `rhs_expr_id` to a value. - /// 2. If `rhs_expr_id` successfully evaluates to a value, we know the corresponding - /// `expr` is a value. - /// - We compare this constant value with the value of `lhs_symbol_id` (the LHS) - /// (the DUT pin) from the trace. - /// - If the values are different, we emit a `ValueDisagreesWithTrace` error - /// 3. If `rhs_expr_id` can't be evaluated to a value (e.g. it fails with a `SymbolNotFound` error), - /// this is either because `rhs_expr_id` is an unsupported expr pattern (indicated w/ `todo!(...)`) - /// or `rhs_expr_id` corresponds to a `Symbol` that is currently not in `args_mapping`. - /// - For the latter, we check if the expr is a symbol. - /// - If it is a symbol `s`, update `args_mapping` to be `args_mapping[s |-> read_trace(lhs_symbol_id)]`, - /// i.e. make the symbol `s` point to the trace value for `lhs_symbol_id` - /// in the resultant `args_mapping`. - /// - For any other expr pattern, we do `todo!(...)` - fn evaluate_assign( - &mut self, - lhs_symbol_id: &SymbolId, - rhs_expr_id: &ExprId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult<()> { - let lhs_name = self.symbol_table.full_name_from_symbol_id(lhs_symbol_id); - match self.evaluate_expr(rhs_expr_id, ctx, trace) { - Ok(ExprValue::Concrete(rhs_value)) => { - let rhs_expr = &self.transaction[rhs_expr_id]; - match rhs_expr { - Expr::Const(_) | Expr::Sym(_) => { - // We only print out the following log for the case - // where a variable evaluates to a value, since the - // constant case is trivial - if let Expr::Sym(_) = rhs_expr { - info!( - "`{}` evaluates to Concrete Value `{}`", - serialize_expr(&self.transaction, &self.symbol_table, rhs_expr_id), - serialize_bitvec(&rhs_value, ctx.display_hex) - ); - } - - // If the `rhs` is a constant or an identifier, - // we compare it with the trace's value for the LHS - if let Ok(trace_value) = trace.get(self.instance_id, *lhs_symbol_id) { - // If they're different, we report an error - if rhs_value != trace_value { - Err(ExecutionError::value_disagrees_with_trace( - *rhs_expr_id, - rhs_value, - trace_value, - *lhs_symbol_id, // Use LHS symbol for error reporting - lhs_name.to_string(), - self.trace_cycle_count, - )) - } else { - // Update the `known_bits` mapping for the RHS - // with all 1s (since the RHS is an input parameter - // whose value we are learning) - if let Expr::Sym(rhs_symbol_id) = rhs_expr { - let width = trace_value.width(); - self.known_bits - .insert(*rhs_symbol_id, BitVecValue::ones(width)); - } - - // If LHS is a DUT input port (has a parent) and RHS is a constant, - // add this as a constraint that must hold after stepping - if let Expr::Const(_) = rhs_expr - && self.symbol_table[*lhs_symbol_id].parent().is_some() - { - info!( - "Adding constraint: {} must equal {}", - lhs_name, - serialize_bitvec(&rhs_value, ctx.display_hex) - ); - self.constraints.insert(*lhs_symbol_id, rhs_value.clone()); - } - - Ok(()) - } - } else { - info!( - "Unable to find value for `{}` in trace at cycle {:?}", - lhs_name, self.trace_cycle_count - ); - Err(ExecutionError::symbol_not_found( - *lhs_symbol_id, - lhs_name.to_string(), - "trace".to_string(), - *rhs_expr_id, - )) - } - } - Expr::Slice(sliced_expr_id, msb, lsb) => { - // In this case, we are taking a bitslice - // of an identifier that we've previously seen before - // (i.e. the identifier exists as a key - // in the `args_mapping`) - - let sliced_expr = &self.transaction[sliced_expr_id]; - match sliced_expr { - Expr::Sym(sliced_symbol_id) => { - let symbol_name = &self.symbol_table[sliced_symbol_id].name(); - info!( - "`{}`[{}:{}] evaluates to Concrete Value `{}`", - symbol_name, - msb, - lsb, - serialize_bitvec(&rhs_value, ctx.display_hex) - ); - - // Compare `rhs_value` (the value that - // `slice_expr[msb:lsb]` evaluates to) - // with the actual trace value - // (Note that we don't need to perform any - // further bit-slicing here, since we've - // already evaluated `slice_expr[msb:lsb]` - - if let Ok(trace_value) = trace.get(self.instance_id, *lhs_symbol_id) - { - // If they're different, we report an error - if rhs_value != trace_value { - Err(ExecutionError::value_disagrees_with_trace( - *rhs_expr_id, - rhs_value, - trace_value, - *lhs_symbol_id, // Use LHS symbol for error reporting - lhs_name.to_string(), - self.trace_cycle_count, - )) - } else { - // The value matches the trace data, - // so all we have to do is update - // `known_bits` for `sliced_symbol_id` - // by setting bits `[msb:lsb]` to 1 - let known_mask = self - .known_bits - .get_mut(sliced_symbol_id) - .unwrap_or_else(|| { - panic!( - "Missing entry in `known_bits` for {}", - symbol_name - ) - }); - for idx in *lsb..=*msb { - known_mask.set_bit(idx); - } - Ok(()) - } - } else { - info!( - "Unable to find value for `{}` in trace at cycle {:?}", - lhs_name, self.trace_cycle_count - ); - Err(ExecutionError::symbol_not_found( - *lhs_symbol_id, - lhs_name.to_string(), - "trace".to_string(), - *rhs_expr_id, - )) - } - } - _ => { - // Illegal bit-slice operation - // (this will already have been caught by the type-checker) - Err(ExecutionError::illegal_slice(*rhs_expr_id, *msb, *lsb)) - } - } - } - _ => todo!( - "Unhandled expr pattern {} which evaluates to {}", - serialize_expr(&self.transaction, &self.symbol_table, rhs_expr_id), - serialize_bitvec(&rhs_value, ctx.display_hex) - ), - } - } - Ok(ExprValue::DontCare) => { - // If the LHS is a DUT (input) port (e.g. `DUT.a`) and we - // encountered a DontCare assignment `DUT.a := X`, - // remove any constraints for it and any parameter bindings - if self.symbol_table[*lhs_symbol_id].parent().is_some() { - self.constraints.remove(lhs_symbol_id); - - info!( - "Cleared bindings for {} in `constraints` due to DontCare assignment", - self.symbol_table[*lhs_symbol_id].full_name(&self.symbol_table) - ); - } - Ok(()) - } - Err(ExecutionError::Symbol(SymbolError::NotFound { .. })) => { - let rhs_expr = &self.transaction[rhs_expr_id]; - match rhs_expr { - Expr::Sym(rhs_symbol_id) => { - let symbol_name = - self.symbol_table[rhs_symbol_id].full_name(&self.symbol_table); - info!( - "RHS of assignment is a symbol `{}` ({}) that is not in the args_mapping, adding it...", - symbol_name, rhs_symbol_id - ); - if let Ok(trace_value) = trace.get(self.instance_id, *lhs_symbol_id) { - self.args_mapping - .insert(*rhs_symbol_id, trace_value.clone()); - info!( - "Updated args_mapping to map {} |-> {}", - symbol_name, - serialize_bitvec(&trace_value, ctx.display_hex) - ); - - // All the bits are known, so we insert a bit-string of - // all 1s into the `known_bits` map - // From type-checking, we know that the bitwidth of the - // LHS & RHS must be the same (otherwise the type-checker - // would have rejected the program) - let width = trace_value.width(); - self.known_bits - .insert(*rhs_symbol_id, BitVecValue::ones(width)); - info!("Updated known_bits to map {} |-> 111...1", symbol_name); - - // Add a constraint saying that `DUT input port := current trace value` - // (This is checked after future `step()`s) - self.constraints.insert(*lhs_symbol_id, trace_value.clone()); - info!( - "Added constraint: {} == {}", - lhs_name, - serialize_bitvec(&trace_value, ctx.display_hex) - ); - - Ok(()) - } else { - Err(ExecutionError::symbol_not_found( - *lhs_symbol_id, - symbol_name, - "trace".to_string(), - *rhs_expr_id, - )) - } - } - // The case below corresponds to a bit-slice - // where the identifier being sliced hasn't been - // encountered before (i.e. is not in the args_mapping) - Expr::Slice(sliced_expr_id, msb, lsb) => { - let sliced_expr = &self.transaction[sliced_expr_id]; - match sliced_expr { - Expr::Sym(sliced_symbol_id) => { - let symbol_name = self.symbol_table[sliced_symbol_id] - .full_name(&self.symbol_table); - info!( - "RHS of assignment is a bit-slice on an identifier `{}[{}:{}]` where `{}` is not in the args_mapping (adding it now...)", - symbol_name, msb, lsb, symbol_name - ); - - // Look up the trace value corresponding - // to the LHS - if let Ok(trace_value) = trace.get(self.instance_id, *lhs_symbol_id) - { - // Look up the width of `sliced_symbol_id` - // based on its type in the `SymbolTable`. - // Call this the `expected_width` - // (the width is dictated by the type) - let expected_width = - self.symbol_table[sliced_symbol_id].tpe().bitwidth(); - info!("{} has type u{}", symbol_name, expected_width); - - // If `sliced_symbol_id` isn't currently - // in either of `args_mapping` & `known_bits`, - // map it to the bit-vector of all zeroes - self.args_mapping - .entry(*sliced_symbol_id) - .or_insert_with(|| BitVecValue::zero(expected_width)); - self.known_bits - .entry(*sliced_symbol_id) - .or_insert_with(|| BitVecValue::zero(expected_width)); - - // We have to clone these values in order - // to satisfy the borrower checker - let mut current_value = - self.args_mapping[sliced_symbol_id].clone(); - let mut current_known_bits = - self.known_bits[sliced_symbol_id].clone(); - - // Update bits `[msb:lsb]` w/ the trace value - for i in 0..=(msb - lsb) { - let bit_pos = lsb + i; - if trace_value.is_bit_set(i) { - current_value.set_bit(bit_pos); - } else { - current_value.clear_bit(bit_pos); - } - // Mark this bit as known - current_known_bits.set_bit(bit_pos); - } - - // Update `args_mapping` and `known_bits` - self.args_mapping - .insert(*sliced_symbol_id, current_value.clone()); - self.known_bits - .insert(*sliced_symbol_id, current_known_bits.clone()); - - info!( - "Updated args_mapping to map {} |-> {} (0b{})", - symbol_name, - serialize_bitvec(¤t_value, ctx.display_hex), - current_value.to_bit_str() - ); - - info!( - "Updated known_bits to map {} |-> {}", - symbol_name, - current_known_bits.to_bit_str() - ); - - Ok(()) - } else { - Err(ExecutionError::symbol_not_found( - *lhs_symbol_id, - symbol_name, - "trace".to_string(), - *sliced_expr_id, - )) - } - } - _ => { - // Illegal bit-slice operation - // (this will already have been caught by the type-checker) - Err(ExecutionError::illegal_slice(*sliced_expr_id, *msb, *lsb)) - } - } - } - _ => { - todo!( - "Unhandled expr pattern {} which results in SymbolNotFound error", - serialize_expr(&self.transaction, &self.symbol_table, rhs_expr_id), - ) - } - } - } - Err(ExecutionError::Evaluation(EvaluationError::InvalidSlice { - expr_id, - start, - end, - width, - })) => { - panic!( - "Evaluation Error: Invalid slice {}[{}:{}] (actual width is {})", - serialize_expr(&self.transaction, &self.symbol_table, &expr_id), - start, - end, - width - ) - } - Err(e) => todo!("Unhandled error {}", e), - } - } - - /// Evaluates a `while`-loop with guard `loop_guard_id` and - /// loop-body `do_block_id`. Note that the argument `while_id` - /// is the `StmtId` for the `while`-loop itself. - fn evaluate_while( - &mut self, - loop_guard_id: &ExprId, - while_id: &StmtId, - do_block_id: &StmtId, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - ) -> ExecutionResult> { - let res = self.evaluate_expr(loop_guard_id, ctx, trace)?; - match res { - ExprValue::DontCare => Err(ExecutionError::invalid_condition( - "while".to_string(), - *loop_guard_id, - )), - ExprValue::Concrete(bvv) => { - if bvv.is_true() { - // Proceed to the next iteration of the loop - Ok(Some(*do_block_id)) - } else { - let next_stmt_str = match self.next_stmt_map[while_id] { - Some(next_stmt_id) => { - format!( - "{} ({})", - serialize_stmt( - &self.transaction, - &self.symbol_table, - &next_stmt_id - ), - next_stmt_id - ) - } - None => "No next stmt".to_string(), - }; - info!( - "Loop guard `{}` evaluated to false, exiting loop, next stmt: `{}`", - serialize_expr(&self.transaction, &self.symbol_table, loop_guard_id), - next_stmt_str, - ); - // Exit the loop, executing the statement that follows it immediately - Ok(self.next_stmt_map[while_id]) - } - } - } - } -} diff --git a/monitor/src/macros.rs b/monitor/src/macros.rs deleted file mode 100644 index 6297f022..00000000 --- a/monitor/src/macros.rs +++ /dev/null @@ -1,52 +0,0 @@ -/// Takes the output of `stdext::debug_name!` (in the `debug_name` argument) -/// and extracts the file name, line number and function name where -/// the log was called, returning a formatted string of -/// the form `file_name:line (function_name)`. -pub fn compact_debug_prefix(debug_name: &str) -> String { - // `stdext::debug_name!` returns strings in the form - // " at `, so we have to split on "at" - let mut debug_parts = debug_name.split(" at "); - let loc = debug_parts.next().unwrap_or("?:0"); - let fn_path = debug_parts.next().unwrap_or("?"); - let mut loc_parts = loc.rsplitn(2, ':'); - let line = loc_parts.next().unwrap_or("0"); - // `stdext::debug_name!` gives us the full filepath - // we just need the stem of the filepath (the file name) - let file_path = loc_parts.next().unwrap_or(loc); - let file = std::path::Path::new(file_path) - .file_name() - .and_then(|f| f.to_str()) - .unwrap_or(file_path); - let fn_name = fn_path.rsplit("::").next().unwrap_or(fn_path); - format!("{}:{} ({})", file, line, fn_name) -} - -/// A wrapper around the `log::info!` macro, which includes the function name, -/// file name and line number in which the log was called -/// (obtained via `stdext::debug_name!`) -macro_rules! info { - ($($arg:tt)*) => {{ - let location = crate::macros::compact_debug_prefix(&stdext::debug_name!()); - log::info!( - target: "info", - "{}: {}", - location, - format_args!($($arg)*) - ) - }} -} - -/// Like `info!`, but prefixes the target with `"repeat::"` so logs can be filtered -/// independently of other logs. Use this macro when logging events -/// related to `repeat` loops. -macro_rules! repeat_info { - ($($arg:tt)*) => {{ - let location = crate::macros::compact_debug_prefix(&stdext::debug_name!()); - log::info!( - target: "repeat", - "{}: {}", - location, - format_args!($($arg)*) - ) - }} -} diff --git a/monitor/src/main.rs b/monitor/src/main.rs deleted file mode 100644 index 0d2d72c0..00000000 --- a/monitor/src/main.rs +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2025 Cornell University -// released under MIT License -// author: Ernest Ng -// author: Kevin Laeufer - -#[macro_use] -mod macros; -mod designs; -mod global_context; -mod global_scheduler; -mod interpreter; -mod queue; -mod scheduler; -mod signal_trace; -mod thread; -mod types; - -use std::io::Write; - -use anyhow::{Context, anyhow}; -use clap::{ColorChoice, Parser}; -use clap_verbosity_flag::{Verbosity, WarnLevel}; -use log::LevelFilter; -use protocols::frontend; -use protocols::frontend::diagnostic::DiagnosticHandler; - -use crate::designs::*; -use crate::global_context::GlobalContext; -use crate::global_scheduler::GlobalScheduler; -use crate::scheduler::Scheduler; -use crate::signal_trace::WaveSignalTrace; - -// From the top-level directory, run: -// $ cargo run --package protocols-monitor -- -p tests/adders/adder_d1/add_d1.prot -w trace.fst -i add_d1:Adder - -/// Args for the monitor CLI -#[derive(Parser, Debug)] -#[command(version, about, long_about = None, disable_version_flag = true)] -struct Cli { - #[arg( - short, - long, - value_name = "PROTOCOLS_FILE", - help = "One or several protocol files." - )] - protocol: Vec, - - /// Path to a waveform trace (.fst, .vcd, .ghw) file - #[arg(short, long, value_name = "WAVE_FILE")] - wave: String, - - /// A mapping of DUT struct in the protocol file to an instance in the signal trace. - /// Multiple arguments can be passed if they're seperated by whitespace. - /// Format is: `${instance_name}:${dut_struct_name}` - #[arg(short, long, value_delimiter = ' ', num_args = 1..)] - instances: Vec, - - /// Users can specify `-v` or `--verbose` to toggle logging - #[command(flatten)] - verbosity: Verbosity, - - /// To suppress colors in error messages, pass in `--color never` - /// Otherwise, by default, error messages are displayed w/ ANSI colors - #[arg(long, value_name = "COLOR_CHOICE", default_value = "auto")] - color: ColorChoice, - - /// If enabled, displays integer literals using hexadecimal notation - #[arg(short, long, value_name = "DISPLAY_IN_HEX")] - display_hex: bool, - - /// Optional argument which specifies the name of the - /// signal to sample on a rising edge (posedge). If enabled, this - /// flag acts as the "clock" signal for the monitor. - /// Note: the full path to the signal should be passed as this argument, - /// e.g. `uut_rx.clk`, where `uut_rx` is an instance in the signal trace. - #[arg(long, value_name = "SIGNAL_TO_SAMPLE_ON_RISING_EDGE")] - sample_posedge: Option, - - /// If enabled, displays the start & end waveform time for each inferred transaction - #[arg(long, value_name = "SHOW_START_END_WAVEFORM_TIME_FOR_EACH_TRANSACTION")] - show_waveform_time: bool, - - /// If enabled, displays the thread ID corresponding to each inferred transaction - #[arg(long, value_name = "SHOW_THREAD_IDS")] - show_thread_ids: bool, - - /// Time unit to use when displaying waveform times (e.g. "ns", "s"). Defaults to "ns". - #[arg(long, value_name = "TIME_UNIT", requires = "show_waveform_time")] - time_unit: Option, - - /// Optional flag: if enabled, prints the no. of (logical) steps - /// (i.e. clock cycles) taken by the montior - #[arg(long, value_name = "PRINT_NUM_STEPS_TAKEN")] - print_num_steps: bool, - - /// Optional flag: if enabled, always prints out idle transcations - /// regardless of whether the protocol has been annotated with `#[idle]` - #[arg(long, value_name = "ALWAYS_PRINT_IDLE_TRANSACTIONS")] - include_idle: bool, - - /// If this CLI flag is specified, - /// the monitor stops after processing after a certain no. of clock cycles. - /// (This should only be used when test the monitor over a large waveform - /// where we only want to see the monitor's output on a prefix of the waveform.) - #[arg(long, value_name = "MAX_STEPS")] - max_steps: Option, - - /// Skips the static checks for step/fork errors. - #[arg(long)] - skip_static_step_fork_checks: bool, -} - -fn main() -> anyhow::Result<()> { - // Parse CLI args - let cli = Cli::parse(); - - // Set up logger to use the log-level specified via the `-v` flag. - // For concision, we disable timestamps and the module paths in the log. - let mut logger = env_logger::Builder::new(); - - // Configure output format of logger. - // For `info!` / `repeat_info!` logs, call-site context is included - // directly by the macros via `debug_name!`. - // When -v is passed, show only repeat-loop logs (target="repeat"). - // All other info-level logs are hidden to reduce noise. - if cli.verbosity.log_level_filter() >= LevelFilter::Info { - logger.filter(None, LevelFilter::Info); - } else { - logger.filter_level(cli.verbosity.log_level_filter()); - } - - logger.format(move |buf, record| { - let target = record.target(); - if target == "repeat" || target == "info" { - writeln!(buf, "{}", record.args()) - } else { - writeln!(buf, "({}): {}", target, record.args()) - } - }); - - if cli.color == ColorChoice::Never { - logger.write_style(env_logger::WriteStyle::Never); - } - - logger.init(); - - // Print warning messages only if `--verbose` is enabled - // (the --verbose flag triggers `LevelFilter::Info`) - let emit_warnings = cli.verbosity.log_level_filter() == LevelFilter::Info; - - // Note: for the monitor, error message locations in `.prot` files are suppressed - // in the `DiagnosticHandlers` for now - let mut protocols_handler = - DiagnosticHandler::new(cli.color, false, emit_warnings, cli.display_hex); - - // Parse protocols file - let (st, modules) = frontend( - &cli.protocol, - &mut protocols_handler, - cli.skip_static_step_fork_checks, - )?; - - // Try to find instances that we care about - if cli.instances.is_empty() { - println!("Available DUTs are: {}", collects_module_names(&modules)); - println!("No instances specified. Nothing to monitor. Exiting..."); - return Ok(()); - } - - let instances: Vec = cli - .instances - .iter() - .map(|arg| parse_instance(&modules, arg)) - .collect(); - - // parse waveform - let trace = WaveSignalTrace::open( - &cli.wave, - &modules, - &instances, - cli.sample_posedge.clone(), - cli.time_unit.clone(), - ) - .with_context(|| format!("failed to read waveform file {}", cli.wave))?; - - // Check if we have multiple structs/designs - let multiple_structs = instances.len() > 1; - - // Multi-struct mode: create a GlobalScheduler with one scheduler per design - let mut schedulers = vec![]; - - // We use the index of `design` in `dut_designs` as our `instance_id` - for (instance_id, inst) in instances.iter().enumerate() { - // Filter transactions that belong to this design - let module = &modules[inst.module_id]; - - if module.protos.is_empty() { - continue; // Skip designs with no transactions - } - - // Create a scheduler for this design, using the design name as the struct name - let scheduler = Scheduler::initialize( - &st, - &module.protos, - &trace, - module.name.clone(), - instance_id as u32, - ); - - schedulers.push(scheduler); - } - - // Create a `GlobalScheduler` whose `schedulers` field - // contains all the initialized schedulers - let mut global_scheduler = GlobalScheduler::new(schedulers, trace); - - // Create a GlobalContext that is shared across all schedulers - // (regardless of which `struct` they belong to) - let ctx = GlobalContext::new(&cli, multiple_structs); - - if let Err(error_msg) = global_scheduler.run(&ctx) { - eprintln!("{error_msg}"); - return Err(anyhow!("Monitor failed")); - } - - Ok(()) -} diff --git a/monitor/src/queue.rs b/monitor/src/queue.rs deleted file mode 100644 index aeb0ba9b..00000000 --- a/monitor/src/queue.rs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2026 Cornell University -// released under MIT License -// author: Ernest Ng - -/*! This file defines a `Queue` data structure, representing a ready - * queue of threads. This type is used in the monitor scheduler. - */ - -use std::collections::VecDeque; - -use protocols::frontend::serialize::serialize_stmt; - -use crate::global_context::GlobalContext; -use crate::signal_trace::WaveSignalTrace; -use crate::thread::Thread; - -/// `Queue` is just a type alias for `VecDeque`. -/// We use a `VecDeque` instead of `Vec`, since `VecDeque::pop_back` produces -/// elements in a FIFO order (which is what we want), -/// whereas `Vec::pop` returns elements in LIFO order -pub type Queue = VecDeque; - -/// Formats a queue's contents into a pretty-printed string -/// Note: we can't implement the `Display` trait for `Queue` since -/// `Queue` is just a type alias -#[allow(dead_code)] -pub fn format_queue( - queue: &Queue, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - struct_name: &str, -) -> String { - if !queue.is_empty() { - let formatted_queue = queue - .iter() - .map(|thread| format_thread(thread, ctx, trace, struct_name)) - .collect::>() - .join("\n\t"); - format!("\n\t{}", formatted_queue) - } else { - "".to_string() - } -} - -/// Formats a single thread with context-aware timing information -#[allow(dead_code)] -pub fn format_thread( - thread: &Thread, - ctx: &GlobalContext, - trace: &WaveSignalTrace, - struct_name: &str, -) -> String { - let start_info = if ctx.show_waveform_time { - format!("Start time: {}", trace.format_time(thread.start_time_step)) - } else { - format!("Start cycle: {}", thread.start_cycle) - }; - - let transaction_name = if ctx.multiple_structs { - format!("{}::{}", struct_name, thread.transaction.name) - } else { - thread.transaction.name.clone() - }; - - format!( - "THREAD {}: {{ {}, Transaction: `{}`, Current stmt: `{}` ({}) }}", - thread.global_thread_id(ctx), - start_info, - transaction_name, - serialize_stmt( - &thread.transaction, - &thread.symbol_table, - &thread.current_stmt_id - ), - thread.current_stmt_id - ) -} - -/// Formats a queue's contents into a *compact* pretty-printed string -/// (i.e. no new-lines, only displays the thread_id and transaction name -/// for each thread) -pub fn format_queue_compact(queue: &Queue, ctx: &GlobalContext) -> String { - if !queue.is_empty() { - queue - .iter() - .map(|thread| { - format!( - "Thread {} (`{}`)", - thread.global_thread_id(ctx), - thread.transaction.name - ) - }) - .collect::>() - .join(", ") - } else { - "".to_string() - } -} - -/// Extracts all elements in the `Queue` where all the threads have the -/// same `start_cycle`, preserving their order -pub fn threads_with_start_time(queue: &Queue, start_cycle: u32) -> Queue { - queue - .clone() - .into_iter() - .filter(|thread| thread.start_cycle == start_cycle) - .collect() -} - -/// Finds all the unique start cycles of all the threads in the same queue -pub fn unique_start_cycles(queue: &Queue) -> Vec { - let mut start_cycles: Vec = queue.iter().map(|thread| thread.start_cycle).collect(); - start_cycles.sort(); - start_cycles.dedup(); - start_cycles -} diff --git a/monitor/src/scheduler.rs b/monitor/src/scheduler.rs deleted file mode 100644 index ea8b258f..00000000 --- a/monitor/src/scheduler.rs +++ /dev/null @@ -1,1113 +0,0 @@ -use anyhow::anyhow; -use baa::{BitVecOps, BitVecValue}; -use protocols::errors::{EvaluationError, ExecutionError}; -use protocols::frontend::ast::{Expr, Protocol, Stmt, StmtId}; -use protocols::frontend::serialize::serialize_bitvec; -use protocols::frontend::symbol::{SymbolId, SymbolTable}; -use rustc_hash::FxHashSet; - -use crate::global_context::GlobalContext; -use crate::interpreter::{Interpreter, serialize_monitor_args_mapping}; -use crate::queue::*; -use crate::signal_trace::{SignalTrace, WaveSignalTrace}; -use crate::thread::Thread; -use crate::types::{ - AugmentedProtocolApplication, AugmentedTrace, CycleResult, LoopArgState, SchedulerError, - ThreadResult, -}; - -/// Scheduler for handling the multiple threads in the monitor -#[derive(Clone)] -pub struct Scheduler { - /// Queue storing threads that are ready (to be run during the current step) - pub current: Queue, - - /// Queue of suspended threads (to be run during the next step) - pub next: Queue, - - /// Threads that have finished successfully - pub finished: Queue, - - /// Threads that failed - pub failed: Queue, - - /// The current scheduling cycle - pub cycle_count: u32, - - /// The no. of threads that have been created so far. - /// (This variable is used to create unique `thread_id`s for `Thread`s.) - pub num_threads: u32, - - /// The associated interpreter for Protocols programs - interpreter: Interpreter, - - /// Flag indicating whether the trace has ended - trace_ended: bool, - - /// Tracks which start cycles have already called fork() in the current cycle - /// (Used to prevent duplicate thread spawning when multiple threads from the - /// same start cycle finish simultaneously) - forked_start_cycles: FxHashSet, - - /// Tracks which thread (if any) has finished in the current cycle - /// Only one thread per struct should finish per cycle - finished_thread: Option<(u32, u32, String)>, // (start_cycle, thread_id, transaction_name) - - /// All possible transactions - /// (This is used when forking new threads) - pub possible_transactions: Vec, - - /// The global symbol table. - pub symbol_table: SymbolTable, - - /// The name of the struct this scheduler is monitoring - /// (Used for prefixing transaction names in multi-struct scenarios) - /// Note: if there is just one single struct, this string is empty - pub struct_name: String, - - /// The instance ID of the DUT instance this scheduler is monitoring. - /// Used to look up the correct signals in the waveform trace. - pub instance_id: u32, - - /// Output buffer, where each element is an `OutputEntry` - /// (defined in `types.rs`). - pub output_buffer: AugmentedTrace, -} - -impl Scheduler { - // Helper function that prefixes a transaction's name with the name of a struct - // if the source file contains multiple struct - pub fn format_transaction_name(&self, ctx: &GlobalContext, transaction_name: String) -> String { - if ctx.multiple_structs { - format!("{}::{}", self.struct_name, transaction_name) - } else { - transaction_name - } - } - - /// Prints the internal state of the scheduler - /// (i.e. the contents of all 4 queues + current scheduling cycle) - #[allow(dead_code)] - pub fn print_scheduler_state(&self, trace: &WaveSignalTrace, ctx: &GlobalContext) { - let time_step = trace.time_step(); - let header = if ctx.show_waveform_time { - format!("SCHEDULER STATE, TIME {}:", trace.format_time(time_step)) - } else { - format!("SCHEDULER STATE, CYCLE {}:", self.cycle_count) - }; - info!( - "{}\n{}\n{}\n{}\n{}", - header, - format_args!( - "Current: {}", - format_queue(&self.current, ctx, trace, &self.struct_name) - ), - format_args!( - "Next: {}", - format_queue(&self.next, ctx, trace, &self.struct_name) - ), - format_args!( - "Failed: {}", - format_queue(&self.failed, ctx, trace, &self.struct_name) - ), - format_args!( - "Finished: {}", - format_queue(&self.finished, ctx, trace, &self.struct_name) - ) - ); - } - - /// Initializes a `Scheduler` with one scheduled thread for each `(Transcation, SymbolTable)` - /// pair in the argument `transactions`. - /// The `instance_id` indicates the `struct` for which the scheduler is exploring - /// transaction traces (this is useful in `.prot` files when multiple - /// `struct`s are defined). - pub fn initialize( - st: &SymbolTable, - protos: &[Protocol], - trace: &WaveSignalTrace, - struct_name: String, - instance_id: u32, - ) -> Self { - let cycle_count = 0; - let mut thread_id = 0; - let mut current_threads = Queue::new(); - // Create a new thread for each transaction, then push it to the - // end of the `current` queue - for proto in protos { - let thread = Thread::new( - struct_name.clone(), - proto.clone(), - st.clone(), - proto.next_stmt_mapping(), - thread_id, - cycle_count, - trace.time_step(), - ); - current_threads.push_back(thread); - thread_id += 1; - } - // Technically, initializing the `interpreter` here is unnecessary - // since when we pop a thread from the `current` queue, we perform - // a context switch and run the `interpreter` on the transaction/symbol_table - // corresponding to the thread. However, we do this here nonetheless - // since we need to initialize all fields in `Scheduler` struct. - let initial_thread = ¤t_threads[0]; - let initial_transaction = initial_thread.transaction.clone(); - let initial_symbol_table = initial_thread.symbol_table.clone(); - let interpreter = Interpreter::new( - initial_transaction, - initial_symbol_table, - trace, - cycle_count, - instance_id, - ); - Self { - current: current_threads, - next: Queue::new(), - finished: Queue::new(), - failed: Queue::new(), - interpreter, - cycle_count, - num_threads: thread_id, - trace_ended: false, - forked_start_cycles: FxHashSet::default(), - finished_thread: None, - possible_transactions: protos.to_vec(), - symbol_table: st.clone(), - struct_name, - instance_id, - output_buffer: AugmentedTrace::default(), - } - } - - /// Call this function exactly once at the beginning of each cycle - /// (**Don't** call this on a cloned `Scheduler` that is created from a `fork`) - #[allow(unused_variables)] - pub fn begin_cycle(&mut self, trace: &WaveSignalTrace) { - // Clear auxiliary fields at the beginning of each cycle - // to track which start cycles fork/finish in THIS cycle - self.forked_start_cycles.clear(); - self.finished_thread = None; - // self.print_scheduler_state(trace, ctx); - } - - /// Runs the scheduler in the current cycle by repeating the following steps. - /// 1. While the `current` queue is non-empty, - /// pop a thread from the `current` queue and runs it till the next `step` - /// and exmaine its `ThreadResult`. - /// - If it `fork`ed either implicitly or explicitly, return early by - /// signalling to the caller the appropriate `CycleResult` - /// - Otherwise, continue. - /// 2. When the `current` queue is empty, it sets `current` to `next` - /// (marking all suspended threads as ready for execution), - /// then advances the trace to the next step. - /// Notes: - /// - This function is used by `GlobalScheduler::process_group_cycles` - /// to coordinate execution between multiple schedulers. - /// - When a `fork` creates a `Scheduler` clone, call this function - /// on the clone - pub fn process_current_queue( - &mut self, - trace: &WaveSignalTrace, - ctx: &GlobalContext, - ) -> Result { - // info!( - // "Inside `Scheduler::process_current_queue` for {} scheduler", - // self.struct_name - // ); - - // Process each thread. Note that - // this function returns early when a thread `fork`s, with the - // new forked-off threads propagated to the caller - // (`GlobalScheduler::process_group_cycles`) - while let Some(thread) = self.current.pop_front() { - match self.run_thread_till_next_step(thread, trace, ctx)? { - ThreadResult::Completed => continue, - ThreadResult::ExplicitFork { parent } => { - return Ok(CycleResult::Fork { - parent: Box::new(Some(*parent)), - }); - } - ThreadResult::ImplicitFork => { - return Ok(CycleResult::Fork { - parent: Box::new(None), - }); - } - ThreadResult::RepeatLoopFork { - exited_thread, - speculative_thread, - } => { - return Ok(CycleResult::RepeatLoopFork { - exited_thread, - speculative_thread, - }); - } - } - } - - // At this point, all threads have been executed till their next `step` - // and are synchronized (i.e. `current` is empty) - - // Check constraints for all threads in the `next` queue. - // These threads have called `step()` and have more work to do. - // Threads that finished (i.e. they executed the `step()` statement at - // the end of a function) are not in `next`, so they won't be checked. - let mut failed_constraint_checks = Vec::new(); - - for thread in self.next.iter_mut() { - // If any constraints failed, figure out the right time-step/cycle - // to display in the logs - let time_str = if ctx.show_waveform_time { - trace.format_time(trace.time_step()) - } else { - format!("cycle {}", self.interpreter.trace_cycle_count) - }; - - // Check that all constraints in the `constraints` map still hold - // against the current trace values. This is called after each `step()` - // to ensure that assignments like `D.m_axis_tvalid := 1'b1` continue - // to hold after stepping to a new cycle. - for (symbol_id, expected_value) in &thread.constraints { - let symbol_name = thread.symbol_table.full_name_from_symbol_id(symbol_id); - - match trace.get(self.instance_id, *symbol_id) { - Ok(trace_value) => { - if trace_value != *expected_value { - info!( - "Constraint FAILED for thread {} (`{}`) at {}: {} = {} (trace) != {} (expected)", - thread.global_thread_id(ctx), - thread.transaction.name, - time_str, - symbol_name, - serialize_bitvec(&trace_value, ctx.display_hex), - serialize_bitvec(expected_value, ctx.display_hex) - ); - failed_constraint_checks.push(thread.clone()); - } else { - info!( - "Constraint OK for thread {} (`{}`) at {}: {} = {}", - thread.global_thread_id(ctx), - thread.transaction.name, - time_str, - symbol_name, - serialize_bitvec(expected_value, ctx.display_hex) - ); - } - } - Err(_) => { - info!( - "Unable to verify constraint for {} at cycle {:?} - symbol not found in trace", - symbol_name, self.interpreter.trace_cycle_count - ); - // If we can't read the symbol from the trace, treat it as a constraint violation - // (The constraint can't hold if the signal doesn't exist in the trace) - failed_constraint_checks.push(thread.clone()); - } - } - } - } - - // Remove threads that failed constraint checks from `next` and add to `failed` - for failed_thread in failed_constraint_checks { - info!( - "Moving thread {} (`{}`) to `failed` as it failed a constraint check", - failed_thread.global_thread_id(ctx), - failed_thread.transaction.name - ); - self.next.retain(|t| t.thread_id != failed_thread.thread_id); - self.failed.push_back(failed_thread); - } - - // Check that threads in the `finished` and `failed` queues - // behave as expected - self.validate_finished_and_failed_threads(trace, ctx)?; - - Ok(CycleResult::Done) - } - - /// Validates that threads in the `finished` and `failed` queues - /// behave as expected - pub fn validate_finished_and_failed_threads( - &mut self, - trace: &WaveSignalTrace, - ctx: &GlobalContext, - ) -> Result<(), SchedulerError> { - // Find the unique start cycles of all threads in the `finished` queue - let finished_threads_start_cycles = unique_start_cycles(&self.finished); - - // Out of all threads that started in the same cycle & finished in the most recent step... - for start_cycle in finished_threads_start_cycles { - // ...there should only be at most one of them in `finished` - let finished = threads_with_start_time(&self.finished, start_cycle); - if finished.len() > 1 { - let start_time = if ctx.show_waveform_time { - trace.format_time(finished[0].start_time_step) - } else { - format!("cycle {}", start_cycle) - }; - let end_time_step = trace.time_step(); - let end_time = if ctx.show_waveform_time { - trace.format_time(end_time_step) - } else { - format!("cycle {}", self.cycle_count) - }; - - return Err(SchedulerError::Other(anyhow!( - "Scheduler for `{}`: Expected the no. of threads for that started at {} & ended at {} to be at most 1, but instead there were {} ({:?})", - self.struct_name, - start_time, - end_time, - finished.len(), - finished - .iter() - .map(|t| t.transaction.name.clone()) - .collect::>() - ))); - } - let finished_thread = &finished[0]; - - // ...and there shouldn't be any other threads in `next` - let next = threads_with_start_time(&self.next, start_cycle); - if !next.is_empty() { - let start_time_str = if ctx.show_waveform_time { - trace.format_time(finished_thread.start_time_step) - } else { - format!("cycle {}", finished_thread.start_cycle) - }; - let error_context = anyhow!( - "Thread {} (`{}`) finished but there are other threads with the same start time ({}) in the `next` queue, namely {:?}", - finished_thread.global_thread_id(ctx), - finished_thread.transaction.name, - start_time_str, - next.iter() - .map(|t| t.transaction.name.clone()) - .collect::>() - ); - - return Err(SchedulerError::NoTransactionsMatch { - struct_name: self.struct_name.clone(), - error_context, - }); - } - } - - // Next, find the unique start cycles of all threads in `failed` - let failed_threads_start_cycles = unique_start_cycles(&self.failed); - - // Out of all threads that started in the same cycle & failed in the most recent step... - for start_cycle in failed_threads_start_cycles { - // ...if `failed` is non-empty, but `next` and `finished` are non-empty, - // then we should emit an error - // (The expected behavior is that all but one threads that started in - // the same cycle should fail, but here we have the case where - // *all* the threads that started in the same cycle failed) - let failed = threads_with_start_time(&self.failed, start_cycle); - let finished = threads_with_start_time(&self.finished, start_cycle); - let paused = threads_with_start_time(&self.next, start_cycle); - - // We also need to check whether the `next` queue contains - // any threads (regardless of their start time) before emitting - // an error. A thread `t` that started in an EARLIER cycle - // might be paused at an intermediate `step()` (i.e. `t` is in `next`), - // while all threads from the CURRENT `start_cycle` have failed. - // In this case, we still need to try to run `t` since it may - // succeed, even though all threads from the current cycle failed. - // (Example: `picorv32/unsigned_mul.prot`) - // We also check that no threads finished successfully this cycle - // (regardless of their start cycle) before throwing the error -- - // this allows us to handle implicitly forked threads that - // are spawned at the end of fork-free protocols (when they - // reach the final `step()` statement). - if failed.len() > 1 - && finished.is_empty() - && paused.is_empty() - && self.next.is_empty() - && self.finished_thread.is_none() - { - let error_context = anyhow!( - "Out of all threads that started in cycle {}, all but one are expected to fail, but all {} of them failed", - start_cycle, - failed.len() - ); - - return Err(SchedulerError::NoTransactionsMatch { - struct_name: self.struct_name.clone(), - error_context, - }); - } - } - - // Print all the threads that finished & failed during the most recent step - if !self.failed.is_empty() { - if ctx.show_waveform_time { - let time_str = trace.format_time(trace.time_step()); - info!( - "Threads that failed at time {}: {}", - time_str, - format_queue_compact(&self.failed, ctx) - ); - } else { - info!( - "Threads that failed in cycle {}: {}", - self.cycle_count, - format_queue_compact(&self.failed, ctx) - ); - } - - // If there are a non-zero no. of failed threads, - // and there are no threads that finished succesfully / - // no threads waiting to be run / no threads that are currently still running, - // then we know that *all* threads have failed. In which case, we emit - // an error message indicating that no transactions match the given waveform. - let no_transactions_match = - self.current.is_empty() && self.next.is_empty() && self.finished.is_empty(); - - if no_transactions_match { - return Err(SchedulerError::NoTransactionsMatch { - struct_name: self.struct_name.clone(), - error_context: anyhow!("All threads failed for {}", self.struct_name), - }); - } else { - self.failed.clear(); - } - } - - if !self.finished.is_empty() { - if ctx.show_waveform_time { - let time_str = trace.format_time(trace.time_step()); - info!( - "Threads that finished at time {}: {}", - time_str, - format_queue_compact(&self.finished, ctx) - ); - } else { - info!( - "Threads that finished in cycle {}: {}", - self.cycle_count, - format_queue_compact(&self.finished, ctx) - ); - } - self.finished.clear(); - } - - Ok(()) - } - - /// Helper function to print the number of steps taken - pub fn print_step_count(&self, ctx: &GlobalContext) { - if ctx.print_num_steps { - eprintln!( - "No. of steps taken by {} scheduler: {}", - self.struct_name, self.cycle_count - ); - } - } - - /// Advances to the next cycle by moving next queue to current and incrementing cycle count - /// (This function should only be called after `trace.step()` has been called in `GlobalScheduler`) - pub fn advance_to_next_cycle(&mut self, ctx: &GlobalContext, trace: &WaveSignalTrace) { - // If next queue is empty and we're in multi-struct mode, - // spawn new threads for this cycle. - // This is necessary in multi-struct mode where schedulers need to continuously - // try to discover transactions even if all previous threads failed - if self.next.is_empty() && ctx.multiple_structs { - info!( - "Next queue is empty for `{}` scheduler, spawning new threads for cycle {}", - self.struct_name, self.cycle_count - ); - for transaction in &self.possible_transactions { - let new_thread = Thread::new( - self.struct_name.clone(), - transaction.clone(), - self.symbol_table.clone(), - transaction.next_stmt_mapping(), - self.num_threads, - self.cycle_count, - trace.time_step(), - ); - self.num_threads += 1; - info!( - "Adding new thread {} (`{}`) to `next` queue", - new_thread.global_thread_id(ctx), - self.format_transaction_name(ctx, new_thread.transaction.name.clone()) - ); - self.next.push_back(new_thread); - } - } - - // Mark all suspended threads as ready for execution - // by setting `current` to `next`, and setting `next = []` - // (the latter is done via `std::mem::take`) - self.current = std::mem::take(&mut self.next); - self.cycle_count += 1; - self.interpreter.trace_cycle_count += 1; - - // if ctx.show_waveform_time { - // let time_str = trace.format_time(trace.time_step()); - // info!("Advancing to time {}, setting current = next", time_str); - // } else { - // info!( - // "Advancing to cycle {}, setting current = next", - // self.cycle_count - // ); - // } - } - - /// Marks the trace as having ended - /// (This function is used by the `GlobalScheduler` when we reach - /// the end of the trace) - pub fn mark_trace_ended(&mut self) { - self.trace_ended = true; - } - - /// Helper function that emits an error (and terminates the monitor with - /// non-zero exit code). The caller should only call this function - /// when it is determined that no transactions match the provided waveform. - pub fn emit_error(&self, trace: &WaveSignalTrace, ctx: &GlobalContext) -> anyhow::Result<()> { - self.print_step_count(ctx); - let time_str = if ctx.show_waveform_time { - trace.format_time(trace.time_step()) - } else { - format!("cycle {}", self.interpreter.trace_cycle_count) - }; - - let error_msg = anyhow!( - "Failure at {}: No transactions match the waveform in `{}`.\nPossible transactions: [{}]", - time_str, - ctx.waveform_file, - self.possible_transactions - .iter() - .map(|tr| tr.name.clone()) - .collect::>() - .join(", ") - ); - Err(error_msg) - } - - /// Helper function which handles `repeat` loops by forking two threads: - /// - One which exits the loop with the `LoopArg` set to `Known(n)` - /// - One which speculatively executes the loop body for another iteration, - /// with the `LoopArg` set to `Speculative(n + 1)` - /// - /// The arguments to this function are: - /// - The `SymbolId` / `StmtId`s of the `LoopArg`, loop body and the - /// entire loop statement itself - /// - The `current_thread` (which will speculatively execute the loop body - /// for another iteration) - /// - The value `n` that has been currently "guessed" for the `LoopArg` - /// - /// This function returns a `ThreadResult::RepeatLoopFork` containing the - /// two threads. - fn handle_repeat_loops( - &mut self, - loop_arg_symbol_id: SymbolId, - loop_body_id: StmtId, - loop_stmt_id: StmtId, - mut current_thread: Thread, - n: u64, - ) -> ThreadResult { - repeat_info!( - "Thread {} (`{}`): RepeatLoop fork at cycle {} — spawning exited_thread (Thread {}, Known({})) and speculative_thread (Thread {}, Speculative({}))", - current_thread.thread_id, - current_thread.transaction.name, - self.cycle_count, - self.num_threads, - n, - current_thread.thread_id, - n + 1 - ); - // Create a new thread `exited_thread` that is identical - // to the current thread, but it exits the loop - // with the `LoopArg` set to `Known(n)` - let mut exited_thread = current_thread.clone(); - exited_thread.thread_id = self.num_threads; - self.num_threads += 1; - exited_thread - .loop_args_state - .insert(loop_arg_symbol_id, LoopArgState::Known(n)); - - // Also add the `loop_arg` to the `exited_thread`'s - // `args_mapping` and `known_bits` map. - // (The `loop_arg` is an input - // parameter, so other statements in the protocol - // can still refer to it) - let loop_arg_bitwidth = 64; // TODO: simplify this code since we will just treat uint as 64-bit - exited_thread.args_mapping.insert( - loop_arg_symbol_id, - BitVecValue::from_u64(n, loop_arg_bitwidth), - ); - exited_thread - .known_bits - .insert(loop_arg_symbol_id, BitVecValue::ones(loop_arg_bitwidth)); - - repeat_info!( - "Exited thread ({}, `{}`) has args_mapping {}\n", - exited_thread.thread_id, - exited_thread.transaction.name, - serialize_monitor_args_mapping( - &exited_thread.args_mapping, - &exited_thread.symbol_table, - false - ) - ); - - // The exited_thread needs to execute the first statement - // that immediately follow the loop - exited_thread.current_stmt_id = self.interpreter.next_stmt_map[&loop_stmt_id].expect( - "Repeat loops can't be the last statement in a protocol since protocols always end with `step`" - ); - - // Update the current thread's `loop_args` map so that - // the `LoopArg` is now `Speculative(n + 1)` - current_thread.loop_args_state.insert( - loop_arg_symbol_id, - LoopArgState::Speculative(n + 1, loop_stmt_id), - ); - - // The current thread executes the - // loop body for another iteration speculatively - current_thread.current_stmt_id = loop_body_id; - - // Let the global scheduler deal with both threads - // (The current thread is called the `speculative_thread`, - // since it speculatively executes the loop body again - // with the `LoopArg` set to `Speculative(n + 1)`) - ThreadResult::RepeatLoopFork { - exited_thread: Box::new(exited_thread), - speculative_thread: Box::new(current_thread), - } - } - - /// Keeps running a `thread` until: - /// - It reaches the next `step()` or `fork()` statement - /// - It completes succesfully - /// - An error was encountered during execution - pub fn run_thread_till_next_step( - &mut self, - mut thread: Thread, - trace: &WaveSignalTrace, - ctx: &GlobalContext, - ) -> Result { - // info!( - // "Running thread {} (transaction `{}`) till next `step()`...", - // thread.global_thread_id(ctx), - // self.format_transaction_name(ctx, thread.transaction.name.clone()) - // ); - - // Perform a context switch (use the argument thread's `Transaction` - // & associated `SymbolTable` / `NextStmtMap`) - self.interpreter.context_switch(&thread); - - let mut current_stmt_id = thread.current_stmt_id; - - loop { - // Intercept repeat loops before evaluating statements - if let Stmt::RepeatLoop(loop_arg_expr_id, loop_body_id) = - thread.transaction[current_stmt_id] - { - let loop_stmt_id = current_stmt_id; - let loop_arg_symbol_id = match thread.transaction[loop_arg_expr_id] { - Expr::Sym(symbol_id) => symbol_id, - Expr::Const(_) => { - todo!("Maybe allow constants to appear as arguments to repeat loops??") - } - _ => { - unreachable!("Arguments to repeat loops are always SymbolIDs") - } - }; - - // Suppose we already know how many iterations a `repeat` loop - // must take. If so, we execute it deterministically. - // This situation occurs if there are multiple `repeat` loops - // in a protocol that use the same `LoopArg`, e.g. - // `repeat n iterations { ... }; ...; repeat n iterations { ... }` - if let Some(num_remaining_iters) = - thread.repeat_loops_remaining_iters.get_mut(&loop_stmt_id) - { - *num_remaining_iters -= 1; - if *num_remaining_iters == 0 { - repeat_info!( - "Thread {}: repeat_loops_remaining_iters hit 0, exiting loop", - thread.thread_id - ); - thread.repeat_loops_remaining_iters.remove(&loop_stmt_id); - current_stmt_id = self.interpreter.next_stmt_map[&loop_stmt_id].expect( - "Repeat loops can't be the last statement in a protocol since protocols always end with `step()`" - ); - } else { - repeat_info!( - "Thread {}: repeat_loops_remaining_iters = {}, re-entering loop body", - thread.thread_id, - *num_remaining_iters - ); - current_stmt_id = loop_body_id; - } - continue; - } - - // Handle case where the loop argument is already in the thread's - // `args_mapping` (e.g. a value for it has already been - // inferred, via a previous assignment) - if !thread.loop_args_state.contains_key(&loop_arg_symbol_id) - && let Some(loop_arg) = thread.args_mapping.get(&loop_arg_symbol_id) - { - let n = loop_arg.to_u64().unwrap_or_else(|| { - panic!("Unable to convert {} to u64", loop_arg.to_bit_str()) - }); - thread - .loop_args_state - .insert(loop_arg_symbol_id, LoopArgState::Known(n)); - } - - // Now we need to handle the case when the value of a `LoopArg` - // is unknown - match thread.loop_args_state.get(&loop_arg_symbol_id).cloned() { - None => { - // First time seeing loop arg, it is `Unknown` - // (i.e. absent from the thread's `loop_args_state` map), - // so pass in `n = 0` to the `handle_repeat_loops` - // helper function - repeat_info!( - "Thread {}: First encounter of repeat loop (loop_arg `{}`), calling handle_repeat_loops(n=0)", - thread.thread_id, - thread.symbol_table[loop_arg_symbol_id].name() - ); - return Ok(self.handle_repeat_loops( - loop_arg_symbol_id, - loop_body_id, - loop_stmt_id, - thread, - 0, - )); - } - Some(LoopArgState::Speculative(n, stored_loop_stmt_id)) => { - // We disallow nested `repeat` loops that use the - // same loop argument, i.e. we forbid - // `repeat n iterations { repeat n iterations { ... } ... }` - if loop_stmt_id != stored_loop_stmt_id { - panic!( - "Nested `repeat` loops that use the same loop argument `{}` are forbidden", - thread.symbol_table[loop_arg_symbol_id].name() - ) - } - - repeat_info!( - "Thread {}: Speculative({}), calling handle_repeat_loops(n={})", - thread.thread_id, - n, - n - ); - // Fork two threads: - // one with `Known(n)`, one with `Speculative(n + 1)` - return Ok(self.handle_repeat_loops( - loop_arg_symbol_id, - loop_body_id, - loop_stmt_id, - thread, - n, - )); - } - Some(LoopArgState::Known(n)) => { - // Value of `n` has been resolved from a prior loop - // (either with the same `StmtId` or a different `StmtId`) - if n == 0 { - repeat_info!( - "Thread {}: Known(0) — skipping loop body entirely (0 iterations, no step() called inside loop)", - thread.thread_id - ); - // Exit the loop since the `LoopArg` is already known, - // proceed to the next immediate statement - // (evaluated in the next iteration - // of the outer `loop` in this function) - current_stmt_id = self.interpreter.next_stmt_map[&loop_stmt_id].expect( - "Repeat loops can't be the last statement in a protocol since protocols always end with `step()`" - ); - } else { - repeat_info!( - "Thread {}: Known({}) — executing {} iteration(s) of loop body", - thread.thread_id, - n, - n - ); - // Insert it into the thread's `repeat_loops_remaining_iters` - // map, which tracks how many iterations need to be executed - // for this loop - thread.repeat_loops_remaining_iters.insert(loop_stmt_id, n); - current_stmt_id = loop_body_id; - } - continue; - } - } - } - match self.interpreter.evaluate_stmt(¤t_stmt_id, ctx, trace) { - Ok(Some(next_stmt_id)) => { - // Update thread-local maps - // to be the resultant maps in the interpreter - thread.args_mapping = self.interpreter.args_mapping.clone(); - thread.known_bits = self.interpreter.known_bits.clone(); - thread.constraints = self.interpreter.constraints.clone(); - - // Check whether the next statement is `Step` or `Fork` - // This determines if we need to move threads to/from different queues - match thread.transaction[next_stmt_id] { - Stmt::Step => { - // If the current statement itself is a `fork()`, - // it means this thread started directly at the fork - // (e.g. `exited_thread` from `handle_repeat_loops`, i.e. - // the thread that exits the `repeat_loop` - // with `loop_arg = Known(n)` set to some `n`). - // We need to handle the fork (by returning `ExplicitFork` early) - // before moving the current thread - // to the `next` queue, but only if no other threads from the same - // start cycle have already forked this cycle (to avoid duplicates) - if matches!(thread.transaction[current_stmt_id], Stmt::Fork) { - thread.has_forked = true; - let already_forked = - self.forked_start_cycles.contains(&thread.start_cycle); - if !already_forked { - self.forked_start_cycles.insert(thread.start_cycle); - thread.current_stmt_id = next_stmt_id; - return Ok(ThreadResult::ExplicitFork { - parent: Box::new(thread), - }); - } - // If another thread from the same start cycle, - // has already forked in this cycle, - // we just fall through to the normal Step logic below - } - - // if the thread is moving to the `next` queue, - // its `current_stmt_id` is updated to be `next_stmt_id` - thread.current_stmt_id = next_stmt_id; - self.next.push_back(thread); - // self.print_scheduler_state(trace, ctx); - return Ok(ThreadResult::Completed); - } - Stmt::Fork => { - thread.has_forked = true; - - // Check if another thread from the same start cycle has already forked - // in the current cycle for this scheduler. - // If so, skip the fork to avoid creating duplicate threads. - let already_forked = - self.forked_start_cycles.contains(&thread.start_cycle); - - if already_forked { - // info!( - // "Thread {} called `fork()`, but another thread from the same start cycle (cycle {}) already forked in this cycle. Skipping fork to avoid duplicates.", - // thread.global_thread_id(ctx), - // thread.start_cycle - // ); - // Continue from the fork statement onwards - current_stmt_id = next_stmt_id; - } else { - // Here, instead of creating a new thread for - // each possible protocol, we indicate to the - // caller that the current thread forked - - // Indicate that the thread's `start_cycle` - // called `fork` in the current cycle - self.forked_start_cycles.insert(thread.start_cycle); - - // Advance to next statement - thread.current_stmt_id = next_stmt_id; - - // Save the parent thread's state before we exit this function - thread.args_mapping = self.interpreter.args_mapping.clone(); - thread.known_bits = self.interpreter.known_bits.clone(); - thread.constraints = self.interpreter.constraints.clone(); - - // Indicate to the caller that this thread forked - return Ok(ThreadResult::ExplicitFork { - parent: Box::new(thread), - }); - } - } - _ => { - // Default case: update `current_stmt_id` - // to point to `next_stmt_id` - current_stmt_id = next_stmt_id; - } - } - } - Ok(None) => { - // Check if another thread has already finished in this cycle. - // Invariant: Only one thread per struct can finish per cycle - if let Some((first_start_cycle, first_thread_id, first_transaction_name)) = - &self.finished_thread - { - info!( - "Thread {} (`{}`) would have finished, but another thread (thread {} `{}` from start_cycle {}) already finished in this cycle. Marking as failed.", - thread.global_thread_id(ctx), - self.format_transaction_name(ctx, thread.transaction.name.clone()), - first_thread_id, - self.format_transaction_name(ctx, first_transaction_name.to_string()), - first_start_cycle - ); - self.failed.push_back(thread); - // self.print_scheduler_state(trace, ctx); - return Ok(ThreadResult::Completed); - } - - repeat_info!( - "Thread {} (`{}`) finished successfully at time {}, adding to `finished` queue", - thread.global_thread_id(ctx), - self.format_transaction_name(ctx, thread.transaction.name.clone()), - trace.format_time(trace.time_step()) - ); - - // Record this thread as having finished in this cycle - self.finished_thread = Some(( - thread.start_cycle, - thread.thread_id, - thread.transaction.name.clone(), - )); - - // Use the actual time-step from the waveform as the `end_time_step` - let end_time_step = trace.time_step(); - - // Construct a `ProtocolApplication` object - // from the current interpreter state - // (i.e. an entry in the monitor's output trace) - let struct_name = if ctx.multiple_structs { - Some(self.struct_name.clone()) - } else { - None - }; - let is_idle = self.interpreter.transaction.is_idle; - - let prot_app_opt = - self.interpreter - .to_protocol_application(struct_name, ctx, trace); - - if prot_app_opt.is_none() { - info!( - "Unable to construct protocol application for thread {} (`{}`), marking thread as failed", - thread.global_thread_id(ctx), - self.format_transaction_name(ctx, thread.transaction.name.clone()) - ); - self.failed.push_back(thread.clone()); - // self.print_scheduler_state(trace, ctx); - return Ok(ThreadResult::Completed); - } - - if is_idle { - info!( - "Transaction `{}` is marked as idle", - self.interpreter.transaction.name - ); - } - - repeat_info!( - "Thread {}: Pushing {} to output buffer", - thread.thread_id, - prot_app_opt - .clone() - .expect("Expected Some(ProtocolApplication)") - ); - - repeat_info!("next queue: {}", format_queue_compact(&self.next, ctx)); - - // Add the output entry + metadata to the scheduler's - // output buffer - self.output_buffer.push(AugmentedProtocolApplication { - end_cycle_count: self.cycle_count, - protocol_application: prot_app_opt - .expect("Expected Some(ProtocolApplication)"), - start_time_step: thread.start_time_step, - end_time_step, - thread_id: thread.global_thread_id(ctx), - is_idle, - }); - self.finished.push_back(thread.clone()); - - // Implicit fork: if this thread hasn't forked yet, - // indicate to the caller that an implicit fork - // needs to be performed. - // This handles the case where a protocol just ends in - // `step()` without having previously called `fork()` - if !thread.has_forked { - info!( - "Thread {} finished without explicit fork, performing implicit fork", - thread.global_thread_id(ctx) - ); - self.forked_start_cycles.insert(thread.start_cycle); - return Ok(ThreadResult::ImplicitFork); - } else { - return Ok(ThreadResult::Completed); - } - } - Err(err) => { - info!( - "Thread {} (`{}`) encountered `{}`, adding to `failed` queue", - thread.global_thread_id(ctx), - self.format_transaction_name(ctx, thread.transaction.name.clone()), - self.serialize_monitor_error(err, trace, ctx) - ); - self.failed.push_back(thread); - // self.print_scheduler_state(trace, ctx); - return Ok(ThreadResult::Completed); - } - } - } - } - - /// Helper function: out of all the protocols that were executed - /// successfully by the same scheduler - /// (i.e. are in the scheduler's `output_buffer`), this function - /// finds the maximum end-time (clock cycle) when a non-idle protocol finished - pub fn max_non_idle_end_cycle(&self) -> u32 { - self.output_buffer - .iter() - .filter(|e| !e.is_idle) - .map(|e| e.end_cycle_count) - .max() - .unwrap_or(0) - } - - /// Pretty-prints an error message for the monitor - /// (ExprIds/StmtIds are rendered with respect - /// to a `Transaction` and `SymbolTable` in which they reside). - /// Remarks: - /// - At the moment, this function only adds extra information for - /// the `ValueDisagreesWithTrace` error message (this was used for debugging - /// the monitor). Otherwise, it falls-back on the error's `Display` instance. - /// - We put this function here and not in `serialize.rs` of the - /// `protocols` crate, since it depends on some monitor-speciifc functionality - /// (e.g. whether to display the time of the error in time units or - /// in no. of cycles). - pub fn serialize_monitor_error( - &self, - err: ExecutionError, - trace: &WaveSignalTrace, - ctx: &GlobalContext, - ) -> String { - match err { - ExecutionError::Evaluation(EvaluationError::ValueDisagreesWithTrace { - expr_id: _, - value, - trace_value, - symbol_id, - symbol_name, - cycle_count, - }) => { - let time_str = if ctx.show_waveform_time { - trace.format_time(trace.time_step()) - } else { - format!("cycle {}", cycle_count) - }; - - format!( - "At {}: we expected {} ({}) to have value {}, but the trace value {} is different", - time_str, - symbol_name, - symbol_id, - serialize_bitvec(&value, false), - serialize_bitvec(&trace_value, false), - ) - } - _ => format!("{err}"), - } - } -} diff --git a/monitor/src/signal_trace.rs b/monitor/src/signal_trace.rs deleted file mode 100644 index ed2b2e03..00000000 --- a/monitor/src/signal_trace.rs +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2025-26 Cornell University -// released under MIT License -// author: Kevin Laeufer -// author: Ernest Ng - -use crate::designs::Instance; -use anyhow::Context; -use baa::BitVecValue; -use protocols::frontend::Module; -use protocols::frontend::symbol::SymbolId; -use rand::SeedableRng; -use rustc_hash::FxHashMap; -use wellen::{Hierarchy, SignalEncoding, SignalRef}; - -/// The result of advancing the clock cycle by one step -#[derive(Debug)] -pub enum StepResult { - /// advance time by one step and there are values available for this step - Ok, - /// no more values available - Done, -} - -/// Provides a trace of signals that we can analyze. -pub trait SignalTrace { - /// Advance to the next time step - /// (This should map 1:1 to a `step` in the Protocol) - fn step(&mut self) -> StepResult; - - /// Returns value of a design input / output at the current step. - /// Returns `Err` if the `pin` doesn't exist in the port map - /// for the given instance. - fn get(&self, instance_id: u32, pin: SymbolId) -> anyhow::Result; -} - -/// The `WaveSamplingMode` determines how signals from a waveform are sampled -#[derive(Debug)] -#[allow(dead_code)] -pub enum WaveSamplingMode { - /// Sample on the rising edge of the signal, specified by its - /// signal identifier (a `SignalRef`) - RisingEdge(SignalRef), - /// Sample on the falling edge of the signal, specified by its - /// signal identifier (a `SignalRef`) - FallingEdge(SignalRef), - /// Interpret every time step as a new clock step. This generally only works - /// for waveforms produced by the Patronus simulator. - Direct, -} - -/// Waveform dump based implementation of a signal trace. -#[derive(Debug)] -#[allow(dead_code)] -pub struct WaveSignalTrace { - wave: wellen::simple::Waveform, - pub port_map: FxHashMap, - - /// The sampling mode to be used on the waveform - sampling_mode: WaveSamplingMode, - - /// The current (logical) `step()` in the Protocols specification - logical_step: u32, - - /// The actual clock time-step in the waveform - time_step: u32, - - /// An (optional) reference to the signal to treat as the clock signal - /// (to be sampled on every rising clockedge) - /// Note that this field is only `Some` if the user passes an argument - /// to the optional `--sample_posedge` CLI argument - clock_signal: Option, - - /// The time unit to use when formatting time values. - /// Note: we only support "ns" and "s" at the moment for simplicity. - time_unit: String, -} - -/// A `PortKey` is just a pair consisting of an `instance_id` and a `symbol_id` for a pin -#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)] -pub struct PortKey { - pub instance_id: u32, - pub pin_id: SymbolId, -} - -impl WaveSignalTrace { - /// Returns the actual clock time-step index in the waveform - pub fn time_step(&self) -> u32 { - self.time_step - } - - /// Returns the actual time value (in the waveform's time units) for a given time_step index - pub fn time_value(&self, time_step: u32) -> u64 { - self.wave.time_table()[time_step as usize] - } - - /// Formats a time value from the waveform using the configured time unit - pub fn format_time(&self, time_step: u32) -> String { - let time_value = self.time_value(time_step); - - // Convert raw time value to nanoseconds using the waveform's timescale. - const FS_PER_NS: f64 = 1_000_000.0; - let time_ns = if let Some(timescale) = self.wave.hierarchy().timescale() { - let fs_per_unit: f64 = match timescale.unit { - wellen::TimescaleUnit::FemtoSeconds => 1.0, - wellen::TimescaleUnit::PicoSeconds => 1_000.0, - wellen::TimescaleUnit::NanoSeconds => 1_000_000.0, - wellen::TimescaleUnit::MicroSeconds => 1_000_000_000.0, - wellen::TimescaleUnit::MilliSeconds => 1_000_000_000_000.0, - wellen::TimescaleUnit::Seconds => 1_000_000_000_000_000.0, - _ => 1.0, - }; - (time_value as f64) * (timescale.factor as f64) * fs_per_unit / FS_PER_NS - } else { - time_value as f64 - }; - - // Convert from ns to s if needed - let (time_out, unit_str) = match self.time_unit.as_str() { - "s" => (time_ns / 1_000_000_000.0, "s"), - _ => (time_ns, "ns"), - }; - - if (time_out - time_out.round()).abs() < 1e-10 { - format!("{}{}", time_out as u64, unit_str) - } else { - let formatted = format!("{:.3}", time_out); - let trimmed = formatted.trim_end_matches('0').trim_end_matches('.'); - format!("{}{}", trimmed, unit_str) - } - } - - /// Opens a waveform at the specified `filename` with the given - /// `Design`s and `Instance`s. The CLI arg `sample_posedge` is passed - /// as an argument to determine the `WaveSamplingMode` (whether it is - /// `Direct` or `RisingEdge`). - pub fn open( - filename: &impl AsRef, - modules: &[Module], - instances: &[Instance], - sample_posedge: Option, - time_unit: Option, - ) -> Result { - let mut wave = wellen::simple::read(filename)?; - - // find instances in the waveform hierarchy - let (port_map, clock_signal) = - find_instances(wave.hierarchy(), modules, instances, sample_posedge); - - // Determine the sampling mode based on the vavlue received - // for `clock_signal`. Note: we only support `Direct` & `RisingEdge` - // for now (`FallingEdge` is currently unsupported). - let sampling_mode = if let Some(signal_ref) = clock_signal { - WaveSamplingMode::RisingEdge(signal_ref) - } else { - WaveSamplingMode::Direct - }; - - // load all relavant signal references into memory - let mut signals: Vec = port_map.values().cloned().collect(); - // Add clock signal if present - if let Some(clk_sig) = clock_signal { - signals.push(clk_sig); - } - signals.sort(); - signals.dedup(); - wave.load_signals(&signals); - - Ok(Self { - wave, - port_map, - sampling_mode, - - // At the beginning, zero `step()` calls have happened, - // so `logical_step` is initialized to 0 - logical_step: 0, - - // The waveform begins with `TimeIdx = 0` - time_step: 0, - - clock_signal, - - time_unit: time_unit.unwrap_or_else(|| "ns".to_string()), - }) - } - - /// Helper function that returns the string representation of a - /// `SignalValue` associated with a particular `SignalRef` - /// at a given `time_step` - fn get_value(&self, signal_ref: SignalRef, time_step: u32) -> String { - // Get the clock signal - let signal = self - .wave - .get_signal(signal_ref) - .unwrap_or_else(|| panic!("Unable to get signal for SignalRef {:?}", signal_ref)); - let offset = signal - .get_offset(time_step) - .unwrap_or_else(|| panic!("Unable to get offset for time_step {}", time_step)); - // Get the last value in the time step (this is to deal with delta cycles) - let value = signal.get_value_at(&offset, offset.elements - 1); - value - .to_bit_string() - .unwrap_or_else(|| panic!("Unable to convert {value} to bit-string")) - } -} - -/// Checks instances and returns a pair consisting of the (port map, optional clock signal) -/// (the latter is only `Some` if `sample_posedge` corresponds to a valid signal) -fn find_instances( - hierachy: &Hierarchy, - modules: &[Module], - instances: &[Instance], - sample_posedge: Option, -) -> (FxHashMap, Option) { - let mut port_map = FxHashMap::default(); - - let mut clock_signal: Option = None; - - for (inst_id, inst) in instances.iter().enumerate() { - // fetch the design from the hashmap (the design tells us what pins to expect) - let module = &modules[inst.module_id]; - - let inst_name_parts: Vec<&str> = inst.name.split('.').collect(); - if let Some(instance_scope) = hierachy.lookup_scope(&inst_name_parts) { - let instance_scope = &hierachy[instance_scope]; - - // for every pin designed in our struct, we have to find the correct - // variable that corresponds to it - for (field_idx, field) in module.pins.iter().enumerate() { - // find a variable that has a matching name - if let Some(var) = instance_scope - .vars(hierachy) - .find(|v| hierachy[*v].name(hierachy) == field.name()) - { - let waveform_bits = hierachy[var].length().expect("not a bit vector"); - - // Set up `sample_posedge` to - // refer to the clock signal (if one is specified) - if let Some(ref signal_name) = sample_posedge { - let clock_signal_parts: Vec<&str> = signal_name.split('.').collect(); - - // The clock signal should be in the same scope as the instance - // So we look it up directly in the instance_scope - match clock_signal_parts.last() { - Some(var_name) => { - if let Some(var) = instance_scope - .vars(hierachy) - .find(|v| hierachy[*v].name(hierachy) == *var_name) - { - let signal_ref = hierachy[var].signal_ref(); - clock_signal = Some(signal_ref); - } else { - // If not found in instance scope, use `lookup_var` - // (We exclude the final element from `clock_signal_parts`, - // since that is equal to `var_name`) - match hierachy.lookup_var( - &clock_signal_parts[..clock_signal_parts.len() - 1], - var_name, - ) { - Some(var_ref) => { - let signal_ref = hierachy[var_ref].signal_ref(); - clock_signal = Some(signal_ref); - } - None => { - panic!("Unable to find signal {var_name} in waveform") - } - } - } - } - None => panic!("Malformed signal {signal_name}"), - } - } - - // Check that bit widths match - assert_eq!( - waveform_bits, - field.bitwidth(), - "The bit-width of the waveform value is {}, which doesn't match expected width of {}, which is {}", - waveform_bits, - field.name(), - field.bitwidth() - ); - - // store a mapping from any SymbolId that refers to this pin - let value = hierachy[var].signal_ref(); - for syms in module.proto_pin_map.iter() { - let key = PortKey { - instance_id: inst_id as u32, - pin_id: syms[field_idx], - }; - port_map.insert(key, value); - } - } else { - // unable to find a variable whose name matches a pin - let available_vars: Vec<&str> = instance_scope - .vars(hierachy) - .map(|v| hierachy[v].name(hierachy)) - .collect(); - panic!( - "Failed to find pin {}. Available pins in waveform for instance {} are {}", - field.name(), - inst.name, - available_vars.join(",\n") - ); - } - } - } else { - panic!( - "Failed to find instance {}. First scope: {:#?}", - inst.name, - hierachy.first_scope().unwrap().full_name(hierachy) - ); - } - } - (port_map, clock_signal) -} - -impl SignalTrace for WaveSignalTrace { - /// Advance to the next time step - /// (This should map 1:1 to a `step` in the Protocol) - fn step(&mut self) -> StepResult { - // The no. of times we can call `step` is 1 less than the - // total no. of cycles available in the signal trace - let total_steps = (self.wave.time_table().len() - 1) as u32; - match self.sampling_mode { - // A `Direct` sampling mode means a `logical_step` maps 1:1 - // to a `time_step` in the waveform - WaveSamplingMode::Direct => { - // If we haven't reached the end of the waveform yet - // (i.e. if `self.logical_step < total_steps`) - // increment the `logical_step` & `time_step` together - if self.logical_step < total_steps { - self.logical_step += 1; - self.time_step += 1; - } - if self.logical_step == total_steps { - StepResult::Done - } else { - StepResult::Ok - } - } - // Sample on the next rising edge of `clock_signal_ref` - WaveSamplingMode::RisingEdge(clock_signal_ref) => { - // First, increment the logical step - self.logical_step += 1; - - let old_time = self.format_time(self.time_step); - - // Next, as long as the time-step is in bounds... - while self.time_step < total_steps { - // ...first fetch the current signal value before incrementing - let prev_value = self.get_value(clock_signal_ref, self.time_step); - - // Then, increment the `time_step`, and check whether - // the prevous value is 0 while the new value is 1 - // If yes, we have encountered a rising clock-edge - // and have found the new `time_step` for the waveform - self.time_step += 1; - let new_value = self.get_value(clock_signal_ref, self.time_step); - if prev_value == "0" && new_value == "1" { - let new_time = self.format_time(self.time_step); - info!("Advanced clock time from {old_time} -> {new_time}"); - - return StepResult::Ok; - } - } - // If we reach this point, we cannot increment the `time_step` - // any further, so we return `Done` to indicate that - // we've reached the end of the waveform - StepResult::Done - } - WaveSamplingMode::FallingEdge(_) => { - todo!("Handle WaveSamplingMode::FallingEdge when stepping WaveSignalTrace") - } - } - } - - /// Returns value of a design input / output at the current (logical) step. - /// Returns `Err` if the `pin` doesn't exist in the port map - /// for the given instance. - fn get(&self, instance_id: u32, pin: SymbolId) -> anyhow::Result { - let key = PortKey { - instance_id, - pin_id: pin, - }; - // Get the Wellen `SignalRef` (akin to `SignalId`) - let signal_ref = self - .port_map - .get(&key) - .with_context(|| format!("Key {:?} doesn't exist in port map", key))?; - - // Obtain the `SignalValue` at the current `time_step` - // (represented as a bit-string) - let bit_str = self.get_value(*signal_ref, self.time_step); - - Ok(BitVecValue::from_bit_str(&bit_str).unwrap_or_else(|_| { - // If the bit-string can't be converted into a BitVecValue - // (e.g. because the waveform contains "x"), generate - // a random value of the appropriate bit-width. - let bitwidth = match self.wave.hierarchy().get_signal_tpe(*signal_ref) { - Some(SignalEncoding::BitVector(width)) => width.get(), - _ => panic!("Expected a bit-vector signal for key {:?}", key), - }; - let mut rng = rand::rngs::SmallRng::seed_from_u64(0); - BitVecValue::random(&mut rng, bitwidth) - })) - } -} diff --git a/monitor/src/thread.rs b/monitor/src/thread.rs deleted file mode 100644 index b7cb219f..00000000 --- a/monitor/src/thread.rs +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2025 Cornell University -// released under MIT License -// author: Ernest Ng - -use baa::BitVecValue; -use protocols::frontend::ast::{Protocol, StmtId}; -use protocols::frontend::serialize::serialize_stmt; -use protocols::frontend::symbol::{SymbolId, SymbolTable}; -use protocols::scheduler::NextStmtMap; -use rustc_hash::FxHashMap; - -use crate::global_context::GlobalContext; -use crate::types::LoopArgState; - -/// The local context associated with an individual thread, -/// storing information such as: -// - Which transaction are we currently running? -// - Where in the transaction are we currently at? (the `StmtId`) -// - A mutable map mapping variable names to their values (`args_mapping`) -#[derive(Debug, Clone)] -pub struct Thread { - /// Name of the scheduler/struct this thread belongs to - /// (Used to create globally unique thread identifiers in multi-struct mode) - pub scheduler_name: String, - - // The thread's ID (unique within this scheduler) - pub thread_id: u32, - - /// The logical scheduling cycle in which the thread was started - /// (This corresponds to the `logical_step` field in `WaveSignalTrace`, - /// i.e. the no. of logical `step()` calls encountered in the program - /// before this thread started) - pub start_cycle: u32, - - /// The actual clock time-step in the waveform - /// at which the thread began. (This corresponds to the `time_step` - /// field in `WaveSignalTrace`.) - pub start_time_step: u32, - - /// The `Transaction` that this `Thread` is running - pub transaction: Protocol, - - /// The `SymbolTable` associated with the `Transaction` - pub symbol_table: SymbolTable, - - /// The `NextStmtMap` associated with the `Transaction` - pub next_stmt_map: NextStmtMap, - - /// Map storing the inferred values for the input and output arguments - pub args_mapping: FxHashMap, - - /// Maps each `SymbolId` to a bit-string, - /// where the `i`-th bit is 1 if it is known & 0 otherwise - pub known_bits: FxHashMap, - - /// Constraints on DUT input port values that must hold after stepping - pub constraints: FxHashMap, - - /// The current statement in the `Transaction`, identified by its `StmtId` - pub current_stmt_id: StmtId, - - /// Maps arguments of `repeat` loops to their current "guessed" state - /// (either `Speculative` or `Known` -- see docs for the `LoopArgState` type) - pub loop_args_state: FxHashMap, - - /// Once the state of a `LoopArg` has been determined, we need to track - /// how many iterations remain to be executed -- this is most useful - /// if we have two loops that use the same `LoopArg`, e.g. - /// `repeat n iterations { ... }; ...; repeat n iterations { ...}`. - /// This map is populated lazily when we encounter each `repeat` loop - /// (see `Scheduler::run_thread_till_next_step`). - /// The `StmtId` key is the statement of the `repeat` loop. - pub repeat_loops_remaining_iters: FxHashMap, - - /// Determines if the thread has called `fork()` yet. Initialized to `false`. - /// Since well-formedness dicates that a protocol can only contain - /// at most one `fork()`, once this flag is set to `true`, - /// it remains `true` for the rest of the thread's execution. - pub has_forked: bool, -} - -/// Pretty-prints a `Thread` -impl std::fmt::Display for Thread { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "THREAD {}: {{ Start cycle: {}, Transaction: `{}`, Current stmt: `{}` ({}) }}", - self.thread_id, - self.start_cycle, - self.transaction.name, - serialize_stmt(&self.transaction, &self.symbol_table, &self.current_stmt_id), - self.current_stmt_id - ) - } -} - -impl Thread { - /// Creates a new `Thread` given the following: - /// - a `scheduler_name` (the name of the corresponding struct) - /// - a `Transaction` - /// - a `SymbolTable` - /// - a `GlobalContext` - /// - a `thread_id` - /// - a `start_cycle` / `start_time_step` - /// This method also sets up the `args_mapping` - /// accordingly based on the pins' values at the beginning of the signal trace. - pub fn new( - scheduler_name: String, - transaction: Protocol, - symbol_table: SymbolTable, - next_stmt_map: NextStmtMap, - thread_id: u32, - start_cycle: u32, - start_time_step: u32, - ) -> Self { - Self { - scheduler_name, - thread_id, - transaction: transaction.clone(), - next_stmt_map, - args_mapping: FxHashMap::default(), - known_bits: FxHashMap::default(), - constraints: FxHashMap::default(), - symbol_table, - current_stmt_id: transaction.body, - start_cycle, - start_time_step, - has_forked: false, - loop_args_state: FxHashMap::default(), - repeat_loops_remaining_iters: FxHashMap::default(), - } - } - - /// Returns an ID for the thread that is unique across all schedulers. - /// If there are multiple structs, this function prefixes the thread ID with - /// the struct name (same as the scheduler name). Otherwise, - /// this functio just returns the regular thread ID. - pub fn global_thread_id(&self, ctx: &GlobalContext) -> String { - if ctx.multiple_structs { - format!("{}::{}", self.scheduler_name, self.thread_id) - } else { - format!("{}", self.thread_id) - } - } -} diff --git a/monitor/src/types.rs b/monitor/src/types.rs deleted file mode 100644 index d6757fab..00000000 --- a/monitor/src/types.rs +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2026 Cornell University -// released under MIT License -// author: Ernest Ng - -/*! Miscellaneous type definitions for the monitor live in this file - */ - -use std::collections::VecDeque; -use std::fmt; -use std::ops::{Deref, DerefMut}; - -use protocols::frontend::ast::StmtId; - -use crate::scheduler::Scheduler; -use crate::thread::Thread; - -/// Represents a protocol application like `add(1, 2, 3)` which appears -/// in the protocol trace produced by the monitor. -/// (We can't use the name `Transaction` for this type as it is already -/// used elsewhere in the codebase.) -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub struct ProtocolApplication { - pub struct_name: Option, - pub protocol_name: String, - pub serialized_args: Vec, // already serialized -} - -impl fmt::Display for ProtocolApplication { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if let Some(ref s) = self.struct_name { - write!(f, "{}::", s)?; - } - write!( - f, - "{}({})", - self.protocol_name, - self.serialized_args.join(", ") - ) - } -} - -/// A `Trace` is just an ordered sequence of `ProtocolApplication`s, e.g. -/// `add(1, 2, 3); add(4, 5, 9), ...]` -pub type Trace = Vec; - -/// An `AugmentedProtocolApplication` represents a singular `ProtocolApplication` -/// (an entry in the the transaction trace produced by the monitor, e.g. `add(1, 2, 3)`) -/// augmented with extra metadata (cycle count, start/end time, thread ID) -#[derive(Clone, Debug)] -pub struct AugmentedProtocolApplication { - /// The scheduling cycle in which the protocol finished - pub end_cycle_count: u32, - - /// A concrete protocol with concrete argument values - pub protocol_application: ProtocolApplication, - - /// The time-step at which the protocol began - pub start_time_step: u32, - - /// The time-step at which the protocol ended - pub end_time_step: u32, - - /// The ID of the thread that executed this protocol - pub thread_id: String, - - /// Whether this transaction was marked `#[idle]` in the protocol file. - /// Idle entries are excluded from the dedup key but still displayed. - pub is_idle: bool, -} - -/// An `AugmentedTrace` is just a wrapper over a vector of -/// `AugmentedProtocolApplication`s (intuitively, a trace is just an -/// ordered sequence of protocols). -/// We define `AugmentedTrace` as a tuple struct so that we can define -/// methods over this type. -#[derive(Clone, Debug, Default)] -pub struct AugmentedTrace(pub Vec); - -/// Allows us to call `iter()` directly on the `AugmentedTrace` type -impl Deref for AugmentedTrace { - type Target = Vec; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -/// Allows us to use mutable `Vec` methods directly on the `AugmentedTrace` type -impl DerefMut for AugmentedTrace { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -/// Allows us to call `into_iter()` directly on the `AugmentedTrace` type -/// (without needing to access the internal `Vec`) -impl IntoIterator for AugmentedTrace { - type Item = AugmentedProtocolApplication; - type IntoIter = std::vec::IntoIter; - - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -impl AugmentedTrace { - /// Helper function: takes a trace and computes the latest clock cycle - /// during which a non-idle protocol finished successfully. - pub fn max_non_idle_end_cycle(&self) -> u32 { - self.iter() - .filter(|entry| !entry.is_idle) - .map(|entry| entry.end_cycle_count) - .max() - .unwrap_or(0) - } -} - -/// Conceptually, a `SchedulerGroup` is the collection of -/// all schedulers corresponding to the same `struct` in our DSL, -/// where each scheduler represents a different possible protocol trace. -/// Practically, a `SchedulerGroup` is implemented as a queue (`VecDeque`) -/// of `Scheduler`s so that we can `push`/`pop` individual `Schedulers` -/// into/from this queue. -pub type SchedulerGroup = VecDeque; - -/// Error types that can occur during scheduler execution -#[derive(Debug)] -pub enum SchedulerError { - NoTransactionsMatch { - struct_name: String, - error_context: anyhow::Error, - }, - /// Other errors (e.g., internal errors, validation failures) - Other(anyhow::Error), -} - -impl From for SchedulerError { - fn from(err: anyhow::Error) -> Self { - SchedulerError::Other(err) - } -} - -/// The result of an individual `Thread` is one of four options: -/// - it `Completed` (was moved to one of the `next/finished/failed` queues) -/// - it forked explicitly (by calling `fork()`) (`ExplicitFork`) -/// - it forked implicitly at the end of a protocol (`ImplicitFork`) -/// - it forked after encountering a `repeat` loop (`RepeatLoopFork`) -#[derive(Debug)] -pub enum ThreadResult { - /// Thread completed (moved to next/finished/failed queue) - Completed, - - /// Thread encountered `fork`. The parent `Thread` is stored as an argument - /// to this constructor, with the `parent` `Thread`'s state updated to - /// it's post-`fork` state. - /// Note: We have to wrap the `Thread` in `Box`, otherwise - /// Clippy complains that there is a large size difference between different - /// constructors of this enum. - ExplicitFork { parent: Box }, - - /// Thread is already in the `finished` queue and forked implicitly - /// (e.g. this thread is a protocol which ends with `step` without - /// ever calling `fork`). The caller of a function which returns - /// this constructor is responsible for spawning new protocol - ImplicitFork, - - /// A fork that arises when learning the value of arguments to `repeat` loops - RepeatLoopFork { - /// The thread that exited the loop with the loop argument - /// set to `Known(n)` for some `n >= 0` - exited_thread: Box, - - /// The thread that remains in the loop and executed the loop body again, - /// with the loop argument set to `Speculative(n + 1)` - speculative_thread: Box, - }, -} - -/// The result of the *Scheduler* at the end of a cycle -#[derive(Debug)] -pub enum CycleResult { - Done, - Fork { - /// The thread that called fork - /// (Some for an explicit fork, None for implicit). - /// Note: We have to wrap the `Thread` in `Box`, otherwise - /// Clippy complains that there is a large size difference between different - /// constructors of this enum. - parent: Box>, - }, - /// A fork that arises when learning the value of arguments to `repeat` loops - RepeatLoopFork { - /// The thread that exited the loop with the loop argument - /// set to `Known(n)` for some `n >= 0` - exited_thread: Box, - - /// The thread that remains in the loop and executed the loop body again, - /// with the loop argument set to `Speculative(n + 1)` - speculative_thread: Box, - }, -} - -/// The possible states for an argument to a `repeat` loop. -/// We maintain the following invariants: -/// - `Speculative(n, loopID) `only becomes `Known(n)` after the corresponding -/// scheduler has executed the body of the loop at `loopID` exactly `n` -/// times (note that `n` can be 0). -/// - Once a `LoopArg` becomes Known, we proceed to the next statement -/// that immediately follows the loop (we don't enter the loop body). -/// - Moreover, once a `LoopArg` remains `Known`, it remains `Known` thereafter. -#[allow(dead_code)] -#[derive(Debug, Clone)] -pub enum LoopArgState { - /// `Speculative(n, loopID)` means the associated thread has already - /// *speculatively* executed the loop at `loopID` for `n` iterations. - /// (The `StmtId` is there to disambiguate between different loop statements, - /// since different loops can use the same loop argument `n`.) - Speculative(u64, StmtId), - Known(u64), -} diff --git a/protocols/src/errors.rs b/protocols/src/errors.rs index f0727ac8..d2e0b057 100644 --- a/protocols/src/errors.rs +++ b/protocols/src/errors.rs @@ -75,7 +75,7 @@ pub enum EvaluationError { start: u32, end: u32, }, - /// (For monitor only) When the value of an expression on the RHS + /// (For bi only) When the value of an expression on the RHS /// of an assignment disagreess with the actual observed trace value ValueDisagreesWithTrace { expr_id: ExprId, @@ -85,7 +85,7 @@ pub enum EvaluationError { symbol_name: String, cycle_count: u32, }, - /// (For monitor only) When a constraint established by an assignment + /// (For bi only) When a constraint established by an assignment /// no longer holds after stepping to a new cycle ConstraintViolation { symbol_id: SymbolId, diff --git a/protocols/src/frontend/serialize.rs b/protocols/src/frontend/serialize.rs index 79e58c39..50d036ec 100644 --- a/protocols/src/frontend/serialize.rs +++ b/protocols/src/frontend/serialize.rs @@ -712,22 +712,6 @@ pub mod tests { ); } - #[test] - fn test_nested_bounded_loop_transaction() { - test_helper( - "../tests/adders/adder_d1/nested_busy_wait.prot", - "nested_bounded_loop", - ); - } - - #[test] - fn test_loop_with_assigns_transaction() { - test_helper( - "../tests/adders/adder_d1/loop_with_assigns.prot", - "loop_with_assigns", - ); - } - #[test] fn test_simple_if_without_else_transaction() { test_helper( diff --git a/protocols/src/tests/snapshots/protocols__frontend__serialize__tests__loop_with_assigns.snap b/protocols/src/tests/snapshots/protocols__frontend__serialize__tests__loop_with_assigns.snap deleted file mode 100644 index 8833ebd7..00000000 --- a/protocols/src/tests/snapshots/protocols__frontend__serialize__tests__loop_with_assigns.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: protocols/src/frontend/serialize.rs -expression: content ---- -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -prot loop_add(a: u32, b: u32, num_iters: uint, s: u32) { - repeat num_iters iterations { - DUT.a := a; - DUT.b := b; - step(); - DUT.a := X; - DUT.b := X; - assert_eq(s, DUT.s); - } - fork(); - step(); -} diff --git a/protocols/src/tests/snapshots/protocols__frontend__serialize__tests__nested_bounded_loop.snap b/protocols/src/tests/snapshots/protocols__frontend__serialize__tests__nested_bounded_loop.snap deleted file mode 100644 index 2236ed0c..00000000 --- a/protocols/src/tests/snapshots/protocols__frontend__serialize__tests__nested_bounded_loop.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: protocols/src/frontend/serialize.rs -expression: content ---- -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -prot nested_busy_wait(a: u32, b: u32, outer_iters: uint, inner_iters: uint, s: u32) { - DUT.a := a; - DUT.b := b; - repeat outer_iters iterations { - repeat inner_iters iterations { - step(); - assert_eq(s, DUT.s); - } - step(); - assert_eq(s, DUT.s); - } - DUT.a := X; - DUT.b := X; - assert_eq(s, DUT.s); - fork(); - step(); -} diff --git a/pyproject.toml b/pyproject.toml index 8a74c79c..83fd56f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,10 @@ [project] name = "protocols" version = "0.1.0" -description = "Scripts for benchmarking the performance of the Protocols monitor" +description = "Scripts for generating the Protocols test catalog and Runt configs" readme = "README.md" requires-python = ">=3.12" -dependencies = [ - "matplotlib>=3.10.8", - "tqdm>=4.67.1", -] +dependencies = [] [dependency-groups] dev = [ diff --git a/runt/bi/runt.toml b/runt/bi/runt.toml new file mode 100644 index 00000000..f3bc3147 --- /dev/null +++ b/runt/bi/runt.toml @@ -0,0 +1,1504 @@ +ver = "0.4.1" + +[[tests]] +name = "bi.tests_adders_add_d1.add_d1_bi" +paths = [ + "../../tests/adders/add_d1.prot", +] +expect_dir = "../../tests/adders/expects" +expect_name = "add_d1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/adders/add_d1.prot --wave tests/adders/add_d1.fst --instances add_d1:Adder 2>&1" + +[[tests]] +name = "bi.tests_adders_add_d2.add_d2_bi" +paths = [ + "../../tests/adders/add_d2.prot", +] +expect_dir = "../../tests/adders/expects" +expect_name = "add_d2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/adders/add_d2.prot --wave tests/adders/add_d2.fst --instances add_d2:Adder 2>&1" + +[[tests]] +name = "bi.tests_adders_add_var_cyc.add_var_cyc_bi" +paths = [ + "../../tests/adders/add_var_cyc.prot", +] +expect_dir = "../../tests/adders/expects" +expect_name = "add_var_cyc.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/adders/add_var_cyc.prot --wave tests/adders/loop_with_assigns.fst --instances add_d1:Adder 2>&1" + +[[tests]] +name = "bi.tests_alus_alu_d1_bi.alu_d1_bi" +paths = [ + "../../tests/alus/alu_d1.bi.prot", +] +expect_dir = "../../tests/alus/expects" +expect_name = "alu_d1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/alus/alu_d1.bi.prot --wave tests/alus/alu_d1.fst --instances alu_d1:ALU 2>&1" + +[[tests]] +name = "bi.tests_alus_alu_d2_bi.alu_d2_bi" +paths = [ + "../../tests/alus/alu_d2.bi.prot", +] +expect_dir = "../../tests/alus/expects" +expect_name = "alu_d2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/alus/alu_d2.bi.prot --wave tests/alus/alu_d2.fst --instances alu_d2:ALU 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_5_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_5.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_5.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_6_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_6.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_6.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_7_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_7.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_7.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_classic_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_classic/expects" +expect_name = "test_fifo_classic_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_5_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_5.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_5.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_6_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_6.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_6.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_7_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_7.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_7.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_fifo_constant_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/fifo_constant/expects" +expect_name = "test_fifo_constant_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_16_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_16_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_16_12_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_16_12.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_16_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_16_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_16_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_16_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_1_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_1_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_1_12_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_1_12.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_1_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_1_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_1_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_1_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_2_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_2_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_2_12_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_2_12.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_2_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_2_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_2_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_2_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_4_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_4_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_4_12_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_4_12.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_4_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_4_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_4_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_4_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_8_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_8_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_8_12_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_8_12.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_8_4_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_8_4.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_classic_8_8_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_classic/expects" +expect_name = "test_sram_classic_8_8.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_0_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_0_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_0_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_0_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_12_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_12_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_12_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_12_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_4_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_4_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_4_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_4_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_8_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_8_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_8_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_16_8_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_0_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_0_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_0_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_0_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_12_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_12_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_12_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_12_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_4_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_4_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_4_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_4_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_8_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_8_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_8_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_1_8_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_0_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_0_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_0_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_0_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_12_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_12_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_12_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_12_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_4_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_4_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_4_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_4_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_8_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_8_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_8_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_2_8_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_0_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_0_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_0_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_0_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_12_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_12_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_12_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_12_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_4_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_4_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_4_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_4_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_8_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_8_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_8_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_4_8_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_0_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_0_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_0_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_0_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_12_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_12_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_12_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_12_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_4_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_4_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_4_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_4_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_0_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_8_0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_1_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_8_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_2_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_8_2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_3_bi" +paths = [ + "../../tests/antmicro/wishbone_subordinate.prot", +] +expect_dir = "../../tests/antmicro/sram_incrementing/expects" +expect_name = "test_sram_incrementing_8_8_3.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_brave_new_world_francis_bit_truncation_fft.bit_truncation_fft_bi" +paths = [ + "../../tests/brave_new_world_francis/bit_truncation_fft.prot", +] +expect_dir = "../../tests/brave_new_world_francis/expects" +expect_name = "bit_truncation_fft.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/brave_new_world_francis/bit_truncation_fft.prot --wave tests/brave_new_world_francis/bit_truncation_fft.fst --instances round11_rne_unsigned_fixed:BitTruncationFFT 2>&1" + +[[tests]] +name = "bi.tests_brave_new_world_francis_bit_truncation_sha.bit_truncation_sha_bi" +paths = [ + "../../tests/brave_new_world_francis/bit_truncation_sha.prot", +] +expect_dir = "../../tests/brave_new_world_francis/expects" +expect_name = "bit_truncation_sha.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/brave_new_world_francis/bit_truncation_sha.prot --wave tests/brave_new_world_francis/bit_truncation_sha.fst --instances bit_truncation_sha_fixed:bit_truncation_sha 2>&1" + +[[tests]] +name = "bi.tests_brave_new_world_francis_ftu_sha.ftu_sha_bi" +paths = [ + "../../tests/brave_new_world_francis/ftu_sha.prot", +] +expect_dir = "../../tests/brave_new_world_francis/expects" +expect_name = "ftu_sha.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/brave_new_world_francis/ftu_sha.prot --wave tests/brave_new_world_francis/ftu_sha.fst --instances fsm_update_fixed_gated:FailureToUpdateSHA 2>&1" + +[[tests]] +name = "bi.tests_brave_new_world_francis_signal_async.signal_async_bi" +paths = [ + "../../tests/brave_new_world_francis/signal_async.prot", +] +expect_dir = "../../tests/brave_new_world_francis/expects" +expect_name = "signal_async.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/brave_new_world_francis/signal_async.prot --wave tests/brave_new_world_francis/signal_async.fst --instances signal_async_fix:SignalAsyncSpec 2>&1" + +[[tests]] +name = "bi.tests_brave_new_world_francis_use_without_valid.use_without_valid_bi" +paths = [ + "../../tests/brave_new_world_francis/use_without_valid.prot", +] +expect_dir = "../../tests/brave_new_world_francis/expects" +expect_name = "use_without_valid.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/brave_new_world_francis/use_without_valid.prot --wave tests/brave_new_world_francis/use_without_valid.fst --instances use_without_valid_fix:UseWithoutValid 2>&1" + +[[tests]] +name = "bi.tests_ethmac_ethmac_wishbone_manager.ethmac_wishbone_manager_bi" +paths = [ + "../../tests/ethmac/ethmac_wishbone_manager.prot", +] +expect_dir = "../../tests/ethmac/expects" +expect_name = "ethmac_wishbone_manager.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/ethmac/ethmac_wishbone_manager.prot --instances tb_ethernet:WBManager --sample-posedge tb_ethernet.wb_clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_ethmac_ethmac_wishbone_subordinate.ethmac_wishbone_subordinate_bi" +paths = [ + "../../tests/ethmac/ethmac_wishbone_subordinate.prot", +] +expect_dir = "../../tests/ethmac/expects" +expect_name = "ethmac_wishbone_subordinate.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/ethmac/ethmac_wishbone_subordinate.prot --instances tb_ethernet:WBSubordinate --sample-posedge tb_ethernet.wb_clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fifo_fifo_bi.fifo_bi" +paths = [ + "../../tests/fifo/fifo.bi.prot", +] +expect_dir = "../../tests/fifo/expects" +expect_name = "fifo.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fifo/fifo.bi.prot --wave tests/fifo/fifo.fst --instances fifo_wrapper:Fifo 2>&1" + +[[tests]] +name = "bi.tests_fifo_push_pop_identity.push_pop_identity_bi" +paths = [ + "../../tests/fifo/push_pop_identity.prot", +] +expect_dir = "../../tests/fifo/expects" +expect_name = "push_pop_identity.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fifo/push_pop_identity.prot --wave tests/fifo/push_pop_identity.fst --instances fifo_wrapper:Fifo 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_burst_s4_s4_buggy.s4_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axi-burst-s4/s4_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-burst-s4/expects" +expect_name = "s4_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-burst-s4/s4_buggy.prot --wave tests/fpga-debugging/axi-burst-s4/s4_buggy.vcd --instances TOP.test_l2_cache_wait_state.axi_bus:WriteSubordinate --sample-posedge TOP.test_l2_cache_wait_state.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_burst_s4_s4_fixed.s4_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axi-burst-s4/s4_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-burst-s4/expects" +expect_name = "s4_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-burst-s4/s4_fixed.prot --wave tests/fpga-debugging/axi-burst-s4/s4_fixed.vcd --instances TOP.test_l2_cache_wait_state.axi_bus:WriteSubordinate --sample-posedge TOP.test_l2_cache_wait_state.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_lite_s1_s1_buggy.s1_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axi-lite-s1/s1_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" +expect_name = "s1_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-lite-s1/s1_buggy.prot --wave tests/fpga-debugging/axi-lite-s1/s1_buggy_workload2.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_lite_s1_s1_buggy_workload_1.s1_buggy_workload_1_bi" +paths = [ + "../../tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" +expect_name = "s1_buggy_workload_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot --wave tests/fpga-debugging/axi-lite-s1/s1_buggy_workload1.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_lite_s1_s1_fixed.s1_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axi-lite-s1/s1_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" +expect_name = "s1_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-lite-s1/s1_fixed.prot --wave tests/fpga-debugging/axi-lite-s1/s1_fixed_workload2.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_lite_s1_s1_fixed_workload_1.s1_fixed_workload_1_bi" +paths = [ + "../../tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" +expect_name = "s1_fixed_workload_1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot --wave tests/fpga-debugging/axi-lite-s1/s1_fixed_workload1.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_stream_s2_s2_buggy.s2_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axi-stream-s2/s2_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-stream-s2/expects" +expect_name = "s2_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-stream-s2/s2_buggy.prot --wave tests/fpga-debugging/axi-stream-s2/s2_buggy.fst --instances TOP.testbench.UUT.axi_stream_check:AXISManager --sample-posedge TOP.testbench.UUT.axi_stream_check.i_aclk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axi_stream_s2_s2_fixed.s2_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axi-stream-s2/s2_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axi-stream-s2/expects" +expect_name = "s2_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axi-stream-s2/s2_fixed.prot --wave tests/fpga-debugging/axi-stream-s2/s2_fixed.fst --instances TOP.testbench.UUT.axi_stream_check:AXISManager --sample-posedge TOP.testbench.UUT.axi_stream_check.i_aclk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_adapter_s3_s3_buggy.s3_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axis-adapter-s3/s3_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-adapter-s3/expects" +expect_name = "s3_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-adapter-s3/s3_buggy.prot --wave tests/fpga-debugging/axis-adapter-s3/s3_buggy.fst --instances TOP.test_axis_adapter_64_8.UUT:AXISManager --sample-posedge TOP.test_axis_adapter_64_8.UUT.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_adapter_s3_s3_fixed.s3_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axis-adapter-s3/s3_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-adapter-s3/expects" +expect_name = "s3_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-adapter-s3/s3_fixed.prot --wave tests/fpga-debugging/axis-adapter-s3/s3_fixed.fst --instances TOP.test_axis_adapter_64_8.UUT:AXISManager --sample-posedge TOP.test_axis_adapter_64_8.UUT.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_async_fifo_c4_c4_buggy.c4_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-async-fifo-c4/expects" +expect_name = "c4_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot --wave tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.fst --instances TOP.test_axis_async_fifo.UUT.axis_reg_inst:Sender TOP.test_axis_async_fifo.UUT.axis_reg_inst:Receiver --sample-posedge TOP.test_axis_async_fifo.UUT.axis_reg_inst.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_async_fifo_c4_c4_fixed.c4_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axis-async-fifo-c4/c4_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-async-fifo-c4/expects" +expect_name = "c4_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-async-fifo-c4/c4_fixed.prot --wave tests/fpga-debugging/axis-async-fifo-c4/c4_fixed.fst --instances TOP.test_axis_async_fifo.UUT.axis_reg_inst:Sender TOP.test_axis_async_fifo.UUT.axis_reg_inst:Receiver --sample-posedge TOP.test_axis_async_fifo.UUT.axis_reg_inst.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_fifo_d11_d11_buggy.d11_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axis-fifo-d11/d11_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-fifo-d11/expects" +expect_name = "d11_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-fifo-d11/d11_buggy.prot --wave tests/fpga-debugging/axis-fifo-d11/d11_buggy.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_fifo_d11_d11_fixed.d11_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axis-fifo-d11/d11_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-fifo-d11/expects" +expect_name = "d11_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-fifo-d11/d11_fixed.prot --wave tests/fpga-debugging/axis-fifo-d11/d11_fixed.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_fifo_d12_d12_buggy.d12_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axis-fifo-d12/d12_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-fifo-d12/expects" +expect_name = "d12_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-fifo-d12/d12_buggy.prot --wave tests/fpga-debugging/axis-fifo-d12/d12_buggy.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_fifo_d12_d12_fixed.d12_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axis-fifo-d12/d12_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-fifo-d12/expects" +expect_name = "d12_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-fifo-d12/d12_fixed.prot --wave tests/fpga-debugging/axis-fifo-d12/d12_fixed.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_fifo_d4_d4_buggy.d4_buggy_bi" +paths = [ + "../../tests/fpga-debugging/axis-fifo-d4/d4_buggy.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-fifo-d4/expects" +expect_name = "d4_buggy.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-fifo-d4/d4_buggy.prot --wave tests/fpga-debugging/axis-fifo-d4/d4_buggy.fst --instances TOP.axis_fifo_wrapper.axis_fifo_inst:AxisFifo --sample-posedge TOP.axis_fifo_wrapper.axis_fifo_inst.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_fpga_debugging_axis_fifo_d4_d4_fixed.d4_fixed_bi" +paths = [ + "../../tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot", +] +expect_dir = "../../tests/fpga-debugging/axis-fifo-d4/expects" +expect_name = "d4_fixed.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot --wave tests/fpga-debugging/axis-fifo-d4/d4_fixed.fst --instances TOP.axis_fifo_wrapper.axis_fifo_inst:AxisFifo --sample-posedge TOP.axis_fifo_wrapper.axis_fifo_inst.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_identities_identity_d1.identity_d1_bi" +paths = [ + "../../tests/identities/identity_d1.prot", +] +expect_dir = "../../tests/identities/expects" +expect_name = "identity_d1.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/identities/identity_d1.prot --wave tests/identities/identity_d1.fst --instances identity_d1:Identity 2>&1" + +[[tests]] +name = "bi.tests_multi_multi0.multi0_bi" +paths = [ + "../../tests/multi/multi0.prot", +] +expect_dir = "../../tests/multi/expects" +expect_name = "multi0.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multi/multi0.prot --wave tests/multi/multi0.fst --instances multi0:multi0 2>&1" + +[[tests]] +name = "bi.tests_multi_multi0keep.multi0keep_bi" +paths = [ + "../../tests/multi/multi0keep.prot", +] +expect_dir = "../../tests/multi/expects" +expect_name = "multi0keep.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multi/multi0keep.prot --wave tests/multi/multi0keep.fst --instances multi0keep:multi0keep 2>&1" + +[[tests]] +name = "bi.tests_multi_multi0keep2const.multi0keep2const_bi" +paths = [ + "../../tests/multi/multi0keep2const.prot", +] +expect_dir = "../../tests/multi/expects" +expect_name = "multi0keep2const.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multi/multi0keep2const.prot --wave tests/multi/multi0keep2const.fst --instances multi0keep2const:multi0keep2const 2>&1" + +[[tests]] +name = "bi.tests_multi_multi2const.multi2const_bi" +paths = [ + "../../tests/multi/multi2const.prot", +] +expect_dir = "../../tests/multi/expects" +expect_name = "multi2const.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multi/multi2const.prot --wave tests/multi/multi2const.fst --instances multi2const:multi2const 2>&1" + +[[tests]] +name = "bi.tests_multi_multi2multi.multi2multi_bi" +paths = [ + "../../tests/multi/multi2multi.prot", +] +expect_dir = "../../tests/multi/expects" +expect_name = "multi2multi.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multi/multi2multi.prot --wave tests/multi/multi2multi.fst --instances multi2multi:multi2multi 2>&1" + +[[tests]] +name = "bi.tests_multi_multi_data.multi_data_bi" +paths = [ + "../../tests/multi/multi_data.prot", +] +expect_dir = "../../tests/multi/expects" +expect_name = "multi_data.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multi/multi_data.prot --wave tests/multi/multi_data.fst --instances multi_data:multi_data 2>&1" + +[[tests]] +name = "bi.tests_multipliers_mult_d2.mult_d2_bi" +paths = [ + "../../tests/multipliers/mult_d2.prot", +] +expect_dir = "../../tests/multipliers/expects" +expect_name = "mult_d2.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/multipliers/mult_d2.prot --wave tests/multipliers/mult_d2.fst --instances mult_d2:Multiplier 2>&1" + +[[tests]] +name = "bi.tests_picorv32_pcpi_mul_unsigned_mul.pcpi_mul_unsigned_mul_bi" +paths = [ + "../../tests/picorv32/pcpi_mul_unsigned_mul.prot", +] +expect_dir = "../../tests/picorv32/expects" +expect_name = "pcpi_mul_unsigned_mul.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/picorv32/pcpi_mul_unsigned_mul.prot --wave tests/picorv32/unsigned_mul.fst --instances picorv32_pcpi_mul:picorv32_pcpi_mul 2>&1" + +[[tests]] +name = "bi.tests_serv_serv_regfile.serv_regfile_bi" +paths = [ + "../../tests/serv/serv_regfile.prot", +] +expect_dir = "../../tests/serv/expects" +expect_name = "serv_regfile.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/serv/serv_regfile.prot --wave tests/serv/serv_regfile.fst --instances serv_regfile:Regfile --display-hex 2>&1" + +[[tests]] +name = "bi.tests_tinyaes128_aes128.aes128_bi" +paths = [ + "../../tests/tinyaes128/aes128.prot", +] +expect_dir = "../../tests/tinyaes128/expects" +expect_name = "aes128.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/tinyaes128/aes128.prot --wave tests/tinyaes128/aes128.fst --instances aes_128:TinyAES128 --display-hex 2>&1" + +[[tests]] +name = "bi.tests_wal_advanced_axis.axis_bi" +paths = [ + "../../tests/wal/advanced/axis.prot", +] +expect_dir = "../../tests/wal/advanced/expects" +expect_name = "axis.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wal/advanced/axis.prot --wave tests/wal/advanced/uart-axi.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_wal_advanced_axis_failing.axis_failing_bi" +paths = [ + "../../tests/wal/advanced/axis_failing.prot", +] +expect_dir = "../../tests/wal/advanced/expects" +expect_name = "axis_failing.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wal/advanced/axis_failing.prot --wave tests/wal/advanced/uart-axi-minimal.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_wal_advanced_axis_minimal.axis_minimal_bi" +paths = [ + "../../tests/wal/advanced/axis_minimal.prot", +] +expect_dir = "../../tests/wal/advanced/expects" +expect_name = "axis_minimal.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wal/advanced/axis_minimal.prot --wave tests/wal/advanced/uart-axi-minimal.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_wal_advanced_axis_truncated.axis_truncated_bi" +paths = [ + "../../tests/wal/advanced/axis_truncated.prot", +] +expect_dir = "../../tests/wal/advanced/expects" +expect_name = "axis_truncated.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wal/advanced/axis_truncated.prot --wave tests/wal/advanced/uart-axi-truncated.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>&1" + +[[tests]] +name = "bi.tests_wal_advanced_axis_truncated_include_idle.axis_truncated_include_idle_bi" +paths = [ + "../../tests/wal/advanced/axis_truncated_include_idle.prot", +] +expect_dir = "../../tests/wal/advanced/expects" +expect_name = "axis_truncated_include_idle.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wal/advanced/axis_truncated_include_idle.prot --wave tests/wal/advanced/uart-axi-truncated.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns --include-idle 2>&1" + +[[tests]] +name = "bi.tests_wb_intercon_wb_arb.wb_arb_bi" +paths = [ + "../../tests/wb_intercon/wb_arb.prot", +] +expect_dir = "../../tests/wb_intercon/expects" +expect_name = "wb_arb.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wb_intercon/wb_arb.prot --instances wb_intercon_tb.wb_arb_tb:WBSubordinate --sample-posedge wb_intercon_tb.wb_arb_tb.wb_clk --show-waveform-time --time-unit s 2>&1" + +[[tests]] +name = "bi.tests_wb_intercon_wb_cdc.wb_cdc_bi" +paths = [ + "../../tests/wb_intercon/wb_cdc.prot", +] +expect_dir = "../../tests/wb_intercon/expects" +expect_name = "wb_cdc.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wb_intercon/wb_cdc.prot --wave tests/wb_intercon/wb_cdc.fst --instances wb_intercon_tb.wb_cdc_tb.dut:WBSubordinate --sample-posedge wb_intercon_tb.wb_cdc_tb.dut.wbm_clk --show-waveform-time --time-unit s 2>&1" + +[[tests]] +name = "bi.tests_wishbone_wishbone_bi.wishbone_bi" +paths = [ + "../../tests/wishbone/wishbone.bi.prot", +] +expect_dir = "../../tests/wishbone/expects" +expect_name = "wishbone.bi.expect" +cmd = "cd ../.. && target/debug/bi --color never --protocol tests/wishbone/wishbone.bi.prot --wave tests/wishbone/reqwalker.vcd --instances TOP.reqwalker:WBSubordinate --sample-posedge TOP.reqwalker.i_clk 2>&1" diff --git a/runt/interp/runt.toml b/runt/interp/runt.toml index 23b631a7..5c652982 100644 --- a/runt/interp/runt.toml +++ b/runt/interp/runt.toml @@ -153,24 +153,6 @@ expect_dir = "../../tests/adders/adder_d1/expects" expect_name = "both_threads_pass.interp.expect" cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/adders/adder_d1/both_threads_pass.tx --verilog tests/adders/adder_d1/add_d1.v --protocol tests/adders/adder_d1/add_d1.prot 2>&1" -[[tests]] -name = "interp.tests_adders_adder_d1_busy_wait_fail.busy_wait_fail_interp" -paths = [ - "../../tests/adders/adder_d1/busy_wait_fail.tx", -] -expect_dir = "../../tests/adders/adder_d1/expects" -expect_name = "busy_wait_fail.interp.expect" -cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/adders/adder_d1/busy_wait_fail.tx --verilog tests/adders/adder_d1/add_d1.v --protocol tests/adders/adder_d1/busy_wait.prot 2>&1" - -[[tests]] -name = "interp.tests_adders_adder_d1_busy_wait_pass.busy_wait_pass_interp" -paths = [ - "../../tests/adders/adder_d1/busy_wait_pass.tx", -] -expect_dir = "../../tests/adders/adder_d1/expects" -expect_name = "busy_wait_pass.interp.expect" -cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/adders/adder_d1/busy_wait_pass.tx --verilog tests/adders/adder_d1/add_d1.v --protocol tests/adders/adder_d1/busy_wait.prot 2>&1" - [[tests]] name = "interp.tests_adders_adder_d1_didnt_end_in_step.didnt_end_in_step_interp" paths = [ @@ -216,24 +198,6 @@ expect_dir = "../../tests/adders/adder_d1/expects" expect_name = "fork_before_step_error.interp.expect" cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/adders/adder_d1/fork_before_step_error.tx --skip-static-step-fork-checks --verilog tests/adders/adder_d1/add_d1.v --protocol tests/adders/adder_d1/fork_before_step_error.prot 2>&1" -[[tests]] -name = "interp.tests_adders_adder_d1_loop_with_assigns.loop_with_assigns_interp" -paths = [ - "../../tests/adders/adder_d1/loop_with_assigns.tx", -] -expect_dir = "../../tests/adders/adder_d1/expects" -expect_name = "loop_with_assigns.interp.expect" -cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/adders/adder_d1/loop_with_assigns.tx --verilog tests/adders/adder_d1/add_d1.v --protocol tests/adders/adder_d1/loop_with_assigns.prot 2>&1" - -[[tests]] -name = "interp.tests_adders_adder_d1_nested_busy_wait.nested_busy_wait_interp" -paths = [ - "../../tests/adders/adder_d1/nested_busy_wait.tx", -] -expect_dir = "../../tests/adders/adder_d1/expects" -expect_name = "nested_busy_wait.interp.expect" -cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/adders/adder_d1/nested_busy_wait.tx --verilog tests/adders/adder_d1/add_d1.v --protocol tests/adders/adder_d1/nested_busy_wait.prot 2>&1" - [[tests]] name = "interp.tests_adders_adder_d1_second_thread_fails.second_thread_fails_interp" paths = [ @@ -477,24 +441,6 @@ expect_dir = "../../tests/fifo/expects" expect_name = "push_pop_identity_ok.interp.expect" cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/fifo/push_pop_identity_ok.tx --verilog tests/fifo/bsg_mem_1rw_sync.v tests/fifo/bsg_mem_1rw_sync_synth.v tests/fifo/bsg_circular_ptr.v tests/fifo/bsg_fifo_1rw_large.v tests/fifo/fifo_wrapper.v --protocol tests/fifo/fifo.prot --module fifo_wrapper 2>&1" -[[tests]] -name = "interp.tests_fifo_push_pop_loop_empty.push_pop_loop_empty_interp" -paths = [ - "../../tests/fifo/push_pop_loop_empty.tx", -] -expect_dir = "../../tests/fifo/expects" -expect_name = "push_pop_loop_empty.interp.expect" -cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/fifo/push_pop_loop_empty.tx --verilog tests/fifo/bsg_mem_1rw_sync.v tests/fifo/bsg_mem_1rw_sync_synth.v tests/fifo/bsg_circular_ptr.v tests/fifo/bsg_fifo_1rw_large.v tests/fifo/fifo_wrapper.v --protocol tests/fifo/fifo_bounded_loop.prot --module fifo_wrapper 2>&1" - -[[tests]] -name = "interp.tests_fifo_push_pop_loop_not_empty.push_pop_loop_not_empty_interp" -paths = [ - "../../tests/fifo/push_pop_loop_not_empty.tx", -] -expect_dir = "../../tests/fifo/expects" -expect_name = "push_pop_loop_not_empty.interp.expect" -cmd = "cd ../.. && target/debug/protocols-interp --color never --transactions tests/fifo/push_pop_loop_not_empty.tx --verilog tests/fifo/bsg_mem_1rw_sync.v tests/fifo/bsg_mem_1rw_sync_synth.v tests/fifo/bsg_circular_ptr.v tests/fifo/bsg_fifo_1rw_large.v tests/fifo/fifo_wrapper.v --protocol tests/fifo/fifo_bounded_loop.prot --module fifo_wrapper 2>&1" - [[tests]] name = "interp.tests_identities_dual_identity_d0_dual_identity_d0_combdep.dual_identity_d0_combdep_interp" paths = [ diff --git a/runt/monitor/runt.toml b/runt/monitor/runt.toml deleted file mode 100644 index aee94652..00000000 --- a/runt/monitor/runt.toml +++ /dev/null @@ -1,1549 +0,0 @@ -ver = "0.4.1" - -[[tests]] -name = "monitor.tests_adders_add_d1.add_d1_monitor" -paths = [ - "../../tests/adders/add_d1.prot", -] -expect_dir = "../../tests/adders/expects" -expect_name = "add_d1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/adders/add_d1.prot --wave tests/adders/add_d1.fst --instances add_d1:Adder 2>/dev/null" - -[[tests]] -name = "monitor.tests_adders_add_d2.add_d2_monitor" -paths = [ - "../../tests/adders/add_d2.prot", -] -expect_dir = "../../tests/adders/expects" -expect_name = "add_d2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/adders/add_d2.prot --wave tests/adders/add_d2.fst --instances add_d2:Adder 2>/dev/null" - -[[tests]] -name = "monitor.tests_adders_add_var_cyc.add_var_cyc_monitor" -paths = [ - "../../tests/adders/add_var_cyc.prot", -] -expect_dir = "../../tests/adders/expects" -expect_name = "add_var_cyc.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/adders/add_var_cyc.prot --wave tests/adders/loop_with_assigns.fst --instances add_d1:Adder 2>/dev/null" - -[[tests]] -name = "monitor.tests_adders_busy_wait.busy_wait_monitor" -paths = [ - "../../tests/adders/busy_wait.prot", -] -expect_dir = "../../tests/adders/expects" -expect_name = "busy_wait.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/adders/busy_wait.prot --wave tests/adders/busy_wait.fst --instances add_d1:Adder 2>/dev/null" - -[[tests]] -name = "monitor.tests_adders_loop_with_assigns.loop_with_assigns_monitor" -paths = [ - "../../tests/adders/loop_with_assigns.prot", -] -expect_dir = "../../tests/adders/expects" -expect_name = "loop_with_assigns.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/adders/loop_with_assigns.prot --wave tests/adders/loop_with_assigns.fst --instances add_d1:Adder 2>/dev/null" - -[[tests]] -name = "monitor.tests_adders_nested_busy_wait.nested_busy_wait_monitor" -paths = [ - "../../tests/adders/nested_busy_wait.prot", -] -expect_dir = "../../tests/adders/expects" -expect_name = "nested_busy_wait.monitor.expect" -cmd = "cd ../.. && python3 -c 'import os, signal, subprocess, sys\np = subprocess.Popen(sys.argv[2:], start_new_session=True)\ntry:\n sys.exit(p.wait(timeout=float(sys.argv[1])))\nexcept subprocess.TimeoutExpired:\n os.killpg(p.pid, signal.SIGKILL)\n sys.exit(124)\n' 5 target/debug/protocols-monitor --protocol tests/adders/nested_busy_wait.prot --wave tests/adders/nested_busy_wait.fst --instances add_d1:Adder 2>/dev/null" - -[[tests]] -name = "monitor.tests_alus_alu_d1_monitor.alu_d1_monitor" -paths = [ - "../../tests/alus/alu_d1.monitor.prot", -] -expect_dir = "../../tests/alus/expects" -expect_name = "alu_d1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/alus/alu_d1.monitor.prot --wave tests/alus/alu_d1.fst --instances alu_d1:ALU 2>/dev/null" - -[[tests]] -name = "monitor.tests_alus_alu_d2_monitor.alu_d2_monitor" -paths = [ - "../../tests/alus/alu_d2.monitor.prot", -] -expect_dir = "../../tests/alus/expects" -expect_name = "alu_d2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/alus/alu_d2.monitor.prot --wave tests/alus/alu_d2.fst --instances alu_d2:ALU 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_5_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_5.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_5.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_6_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_6.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_6.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_7_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_7.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_7.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_classic_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_classic/expects" -expect_name = "test_fifo_classic_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_classic/test_fifo_classic_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_5_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_5.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_5.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_6_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_6.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_6.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_7_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_7.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_7.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_fifo_constant_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/fifo_constant/expects" -expect_name = "test_fifo_constant_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/fifo_constant/test_fifo_constant_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_16_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_16_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_16_12_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_16_12.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_16_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_16_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_16_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_16_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_16_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_1_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_1_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_1_12_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_1_12.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_1_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_1_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_1_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_1_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_1_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_2_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_2_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_2_12_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_2_12.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_2_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_2_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_2_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_2_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_2_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_4_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_4_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_4_12_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_4_12.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_4_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_4_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_4_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_4_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_4_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_8_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_8_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_8_12_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_8_12.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_12.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_8_4_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_8_4.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_4.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_classic_8_8_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_classic/expects" -expect_name = "test_sram_classic_8_8.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_classic/test_sram_classic_8_8.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_0_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_0_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_0_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_0_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_0_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_12_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_12_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_12_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_12_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_12_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_4_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_4_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_4_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_4_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_4_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_8_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_8_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_8_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_16_8_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_16_8_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_16_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_0_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_0_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_0_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_0_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_0_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_12_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_12_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_12_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_12_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_12_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_4_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_4_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_4_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_4_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_4_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_8_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_8_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_8_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_1_8_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_1_8_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_1_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_0_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_0_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_0_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_0_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_0_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_12_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_12_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_12_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_12_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_12_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_4_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_4_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_4_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_4_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_4_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_8_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_8_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_8_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_2_8_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_2_8_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_2_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_0_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_0_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_0_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_0_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_0_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_12_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_12_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_12_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_12_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_12_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_4_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_4_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_4_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_4_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_4_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_8_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_8_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_8_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_4_8_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_4_8_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_4_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_0_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_0_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_0_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_0_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_0_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_0_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_12_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_12_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_12_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_12_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_12_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_12_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_4_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_4_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_4_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_4_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_4_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_4_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_0_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_8_0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_0.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_1_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_8_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_1.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_2_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_8_2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_2.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_antmicro_wishbone_subordinate.test_sram_incrementing_8_8_3_monitor" -paths = [ - "../../tests/antmicro/wishbone_subordinate.prot", -] -expect_dir = "../../tests/antmicro/sram_incrementing/expects" -expect_name = "test_sram_incrementing_8_8_3.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/antmicro/wishbone_subordinate.prot --wave tests/antmicro/sram_incrementing/test_sram_incrementing_8_8_3.fst --instances tb.dut:WBSubordinate --sample-posedge tb.dut.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_brave_new_world_francis_bit_truncation_fft.bit_truncation_fft_monitor" -paths = [ - "../../tests/brave_new_world_francis/bit_truncation_fft.prot", -] -expect_dir = "../../tests/brave_new_world_francis/expects" -expect_name = "bit_truncation_fft.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/brave_new_world_francis/bit_truncation_fft.prot --wave tests/brave_new_world_francis/bit_truncation_fft.fst --instances round11_rne_unsigned_fixed:BitTruncationFFT 2>/dev/null" - -[[tests]] -name = "monitor.tests_brave_new_world_francis_bit_truncation_sha.bit_truncation_sha_monitor" -paths = [ - "../../tests/brave_new_world_francis/bit_truncation_sha.prot", -] -expect_dir = "../../tests/brave_new_world_francis/expects" -expect_name = "bit_truncation_sha.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/brave_new_world_francis/bit_truncation_sha.prot --wave tests/brave_new_world_francis/bit_truncation_sha.fst --instances bit_truncation_sha_fixed:bit_truncation_sha 2>/dev/null" - -[[tests]] -name = "monitor.tests_brave_new_world_francis_ftu_sha.ftu_sha_monitor" -paths = [ - "../../tests/brave_new_world_francis/ftu_sha.prot", -] -expect_dir = "../../tests/brave_new_world_francis/expects" -expect_name = "ftu_sha.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/brave_new_world_francis/ftu_sha.prot --wave tests/brave_new_world_francis/ftu_sha.fst --instances fsm_update_fixed_gated:FailureToUpdateSHA 2>/dev/null" - -[[tests]] -name = "monitor.tests_brave_new_world_francis_signal_async.signal_async_monitor" -paths = [ - "../../tests/brave_new_world_francis/signal_async.prot", -] -expect_dir = "../../tests/brave_new_world_francis/expects" -expect_name = "signal_async.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/brave_new_world_francis/signal_async.prot --wave tests/brave_new_world_francis/signal_async.fst --instances signal_async_fix:SignalAsyncSpec 2>/dev/null" - -[[tests]] -name = "monitor.tests_brave_new_world_francis_use_without_valid.use_without_valid_monitor" -paths = [ - "../../tests/brave_new_world_francis/use_without_valid.prot", -] -expect_dir = "../../tests/brave_new_world_francis/expects" -expect_name = "use_without_valid.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/brave_new_world_francis/use_without_valid.prot --wave tests/brave_new_world_francis/use_without_valid.fst --instances use_without_valid_fix:UseWithoutValid 2>/dev/null" - -[[tests]] -name = "monitor.tests_ethmac_ethmac_wishbone_manager.ethmac_wishbone_manager_monitor" -paths = [ - "../../tests/ethmac/ethmac_wishbone_manager.prot", -] -expect_dir = "../../tests/ethmac/expects" -expect_name = "ethmac_wishbone_manager.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/ethmac/ethmac_wishbone_manager.prot --instances tb_ethernet:WBManager --sample-posedge tb_ethernet.wb_clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_ethmac_ethmac_wishbone_subordinate.ethmac_wishbone_subordinate_monitor" -paths = [ - "../../tests/ethmac/ethmac_wishbone_subordinate.prot", -] -expect_dir = "../../tests/ethmac/expects" -expect_name = "ethmac_wishbone_subordinate.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/ethmac/ethmac_wishbone_subordinate.prot --instances tb_ethernet:WBSubordinate --sample-posedge tb_ethernet.wb_clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fifo_fifo_monitor.fifo_monitor" -paths = [ - "../../tests/fifo/fifo.monitor.prot", -] -expect_dir = "../../tests/fifo/expects" -expect_name = "fifo.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fifo/fifo.monitor.prot --wave tests/fifo/fifo.fst --instances fifo_wrapper:Fifo 2>/dev/null" - -[[tests]] -name = "monitor.tests_fifo_push_pop_identity.push_pop_identity_monitor" -paths = [ - "../../tests/fifo/push_pop_identity.prot", -] -expect_dir = "../../tests/fifo/expects" -expect_name = "push_pop_identity.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fifo/push_pop_identity.prot --wave tests/fifo/push_pop_identity.fst --instances fifo_wrapper:Fifo 2>/dev/null" - -[[tests]] -name = "monitor.tests_fifo_push_pop_loop_empty.push_pop_loop_empty_monitor" -paths = [ - "../../tests/fifo/push_pop_loop_empty.prot", -] -expect_dir = "../../tests/fifo/expects" -expect_name = "push_pop_loop_empty.monitor.expect" -cmd = "cd ../.. && python3 -c 'import os, signal, subprocess, sys\np = subprocess.Popen(sys.argv[2:], start_new_session=True)\ntry:\n sys.exit(p.wait(timeout=float(sys.argv[1])))\nexcept subprocess.TimeoutExpired:\n os.killpg(p.pid, signal.SIGKILL)\n sys.exit(124)\n' 5 target/debug/protocols-monitor --protocol tests/fifo/push_pop_loop_empty.prot --wave tests/fifo/push_pop_loop_empty.fst --instances fifo_wrapper:Fifo 2>/dev/null" - -[[tests]] -name = "monitor.tests_fifo_push_pop_loop_not_empty.push_pop_loop_not_empty_monitor" -paths = [ - "../../tests/fifo/push_pop_loop_not_empty.prot", -] -expect_dir = "../../tests/fifo/expects" -expect_name = "push_pop_loop_not_empty.monitor.expect" -cmd = "cd ../.. && python3 -c 'import os, signal, subprocess, sys\np = subprocess.Popen(sys.argv[2:], start_new_session=True)\ntry:\n sys.exit(p.wait(timeout=float(sys.argv[1])))\nexcept subprocess.TimeoutExpired:\n os.killpg(p.pid, signal.SIGKILL)\n sys.exit(124)\n' 5 target/debug/protocols-monitor --protocol tests/fifo/push_pop_loop_not_empty.prot --wave tests/fifo/push_pop_loop_not_empty.fst --instances fifo_wrapper:Fifo 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_burst_s4_s4_buggy.s4_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axi-burst-s4/s4_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-burst-s4/expects" -expect_name = "s4_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-burst-s4/s4_buggy.prot --wave tests/fpga-debugging/axi-burst-s4/s4_buggy.vcd --instances TOP.test_l2_cache_wait_state.axi_bus:WriteSubordinate --sample-posedge TOP.test_l2_cache_wait_state.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_burst_s4_s4_fixed.s4_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axi-burst-s4/s4_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-burst-s4/expects" -expect_name = "s4_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-burst-s4/s4_fixed.prot --wave tests/fpga-debugging/axi-burst-s4/s4_fixed.vcd --instances TOP.test_l2_cache_wait_state.axi_bus:WriteSubordinate --sample-posedge TOP.test_l2_cache_wait_state.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_lite_s1_s1_buggy.s1_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axi-lite-s1/s1_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" -expect_name = "s1_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-lite-s1/s1_buggy.prot --wave tests/fpga-debugging/axi-lite-s1/s1_buggy_workload2.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_lite_s1_s1_buggy_workload_1.s1_buggy_workload_1_monitor" -paths = [ - "../../tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" -expect_name = "s1_buggy_workload_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot --wave tests/fpga-debugging/axi-lite-s1/s1_buggy_workload1.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_lite_s1_s1_fixed.s1_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axi-lite-s1/s1_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" -expect_name = "s1_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-lite-s1/s1_fixed.prot --wave tests/fpga-debugging/axi-lite-s1/s1_fixed_workload2.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_lite_s1_s1_fixed_workload_1.s1_fixed_workload_1_monitor" -paths = [ - "../../tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-lite-s1/expects" -expect_name = "s1_fixed_workload_1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot --wave tests/fpga-debugging/axi-lite-s1/s1_fixed_workload1.vcd --instances TOP.testbench.UUT:WriteSubordinate TOP.testbench.UUT:ReadSubordinate --sample-posedge TOP.testbench.UUT.S_AXI_ACLK --show-waveform-time --time-unit ns --include-idle 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_stream_s2_s2_buggy.s2_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axi-stream-s2/s2_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-stream-s2/expects" -expect_name = "s2_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-stream-s2/s2_buggy.prot --wave tests/fpga-debugging/axi-stream-s2/s2_buggy.fst --instances TOP.testbench.UUT.axi_stream_check:AXISManager --sample-posedge TOP.testbench.UUT.axi_stream_check.i_aclk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axi_stream_s2_s2_fixed.s2_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axi-stream-s2/s2_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axi-stream-s2/expects" -expect_name = "s2_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axi-stream-s2/s2_fixed.prot --wave tests/fpga-debugging/axi-stream-s2/s2_fixed.fst --instances TOP.testbench.UUT.axi_stream_check:AXISManager --sample-posedge TOP.testbench.UUT.axi_stream_check.i_aclk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_adapter_s3_s3_buggy.s3_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axis-adapter-s3/s3_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-adapter-s3/expects" -expect_name = "s3_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-adapter-s3/s3_buggy.prot --wave tests/fpga-debugging/axis-adapter-s3/s3_buggy.fst --instances TOP.test_axis_adapter_64_8.UUT:AXISManager --sample-posedge TOP.test_axis_adapter_64_8.UUT.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_adapter_s3_s3_fixed.s3_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axis-adapter-s3/s3_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-adapter-s3/expects" -expect_name = "s3_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-adapter-s3/s3_fixed.prot --wave tests/fpga-debugging/axis-adapter-s3/s3_fixed.fst --instances TOP.test_axis_adapter_64_8.UUT:AXISManager --sample-posedge TOP.test_axis_adapter_64_8.UUT.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_async_fifo_c4_c4_buggy.c4_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-async-fifo-c4/expects" -expect_name = "c4_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot --wave tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.fst --instances TOP.test_axis_async_fifo.UUT.axis_reg_inst:Sender TOP.test_axis_async_fifo.UUT.axis_reg_inst:Receiver --sample-posedge TOP.test_axis_async_fifo.UUT.axis_reg_inst.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_async_fifo_c4_c4_fixed.c4_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axis-async-fifo-c4/c4_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-async-fifo-c4/expects" -expect_name = "c4_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-async-fifo-c4/c4_fixed.prot --wave tests/fpga-debugging/axis-async-fifo-c4/c4_fixed.fst --instances TOP.test_axis_async_fifo.UUT.axis_reg_inst:Sender TOP.test_axis_async_fifo.UUT.axis_reg_inst:Receiver --sample-posedge TOP.test_axis_async_fifo.UUT.axis_reg_inst.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_fifo_d11_d11_buggy.d11_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axis-fifo-d11/d11_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-fifo-d11/expects" -expect_name = "d11_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-fifo-d11/d11_buggy.prot --wave tests/fpga-debugging/axis-fifo-d11/d11_buggy.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_fifo_d11_d11_fixed.d11_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axis-fifo-d11/d11_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-fifo-d11/expects" -expect_name = "d11_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-fifo-d11/d11_fixed.prot --wave tests/fpga-debugging/axis-fifo-d11/d11_fixed.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_fifo_d12_d12_buggy.d12_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axis-fifo-d12/d12_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-fifo-d12/expects" -expect_name = "d12_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-fifo-d12/d12_buggy.prot --wave tests/fpga-debugging/axis-fifo-d12/d12_buggy.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_fifo_d12_d12_fixed.d12_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axis-fifo-d12/d12_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-fifo-d12/expects" -expect_name = "d12_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-fifo-d12/d12_fixed.prot --wave tests/fpga-debugging/axis-fifo-d12/d12_fixed.fst --instances TOP.test_axis_fifo:AxisFifo --sample-posedge TOP.test_axis_fifo.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_fifo_d4_d4_buggy.d4_buggy_monitor" -paths = [ - "../../tests/fpga-debugging/axis-fifo-d4/d4_buggy.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-fifo-d4/expects" -expect_name = "d4_buggy.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-fifo-d4/d4_buggy.prot --wave tests/fpga-debugging/axis-fifo-d4/d4_buggy.fst --instances TOP.axis_fifo_wrapper.axis_fifo_inst:AxisFifo --sample-posedge TOP.axis_fifo_wrapper.axis_fifo_inst.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_fpga_debugging_axis_fifo_d4_d4_fixed.d4_fixed_monitor" -paths = [ - "../../tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot", -] -expect_dir = "../../tests/fpga-debugging/axis-fifo-d4/expects" -expect_name = "d4_fixed.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot --wave tests/fpga-debugging/axis-fifo-d4/d4_fixed.fst --instances TOP.axis_fifo_wrapper.axis_fifo_inst:AxisFifo --sample-posedge TOP.axis_fifo_wrapper.axis_fifo_inst.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_identities_identity_d1.identity_d1_monitor" -paths = [ - "../../tests/identities/identity_d1.prot", -] -expect_dir = "../../tests/identities/expects" -expect_name = "identity_d1.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/identities/identity_d1.prot --wave tests/identities/identity_d1.fst --instances identity_d1:Identity 2>/dev/null" - -[[tests]] -name = "monitor.tests_multi_multi0.multi0_monitor" -paths = [ - "../../tests/multi/multi0.prot", -] -expect_dir = "../../tests/multi/expects" -expect_name = "multi0.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multi/multi0.prot --wave tests/multi/multi0.fst --instances multi0:multi0 2>/dev/null" - -[[tests]] -name = "monitor.tests_multi_multi0keep.multi0keep_monitor" -paths = [ - "../../tests/multi/multi0keep.prot", -] -expect_dir = "../../tests/multi/expects" -expect_name = "multi0keep.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multi/multi0keep.prot --wave tests/multi/multi0keep.fst --instances multi0keep:multi0keep 2>/dev/null" - -[[tests]] -name = "monitor.tests_multi_multi0keep2const.multi0keep2const_monitor" -paths = [ - "../../tests/multi/multi0keep2const.prot", -] -expect_dir = "../../tests/multi/expects" -expect_name = "multi0keep2const.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multi/multi0keep2const.prot --wave tests/multi/multi0keep2const.fst --instances multi0keep2const:multi0keep2const 2>/dev/null" - -[[tests]] -name = "monitor.tests_multi_multi2const.multi2const_monitor" -paths = [ - "../../tests/multi/multi2const.prot", -] -expect_dir = "../../tests/multi/expects" -expect_name = "multi2const.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multi/multi2const.prot --wave tests/multi/multi2const.fst --instances multi2const:multi2const 2>/dev/null" - -[[tests]] -name = "monitor.tests_multi_multi2multi.multi2multi_monitor" -paths = [ - "../../tests/multi/multi2multi.prot", -] -expect_dir = "../../tests/multi/expects" -expect_name = "multi2multi.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multi/multi2multi.prot --wave tests/multi/multi2multi.fst --instances multi2multi:multi2multi 2>/dev/null" - -[[tests]] -name = "monitor.tests_multi_multi_data.multi_data_monitor" -paths = [ - "../../tests/multi/multi_data.prot", -] -expect_dir = "../../tests/multi/expects" -expect_name = "multi_data.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multi/multi_data.prot --wave tests/multi/multi_data.fst --instances multi_data:multi_data 2>/dev/null" - -[[tests]] -name = "monitor.tests_multipliers_mult_d2.mult_d2_monitor" -paths = [ - "../../tests/multipliers/mult_d2.prot", -] -expect_dir = "../../tests/multipliers/expects" -expect_name = "mult_d2.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/multipliers/mult_d2.prot --wave tests/multipliers/mult_d2.fst --instances mult_d2:Multiplier 2>/dev/null" - -[[tests]] -name = "monitor.tests_picorv32_pcpi_mul_unsigned_mul.pcpi_mul_unsigned_mul_monitor" -paths = [ - "../../tests/picorv32/pcpi_mul_unsigned_mul.prot", -] -expect_dir = "../../tests/picorv32/expects" -expect_name = "pcpi_mul_unsigned_mul.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/picorv32/pcpi_mul_unsigned_mul.prot --wave tests/picorv32/unsigned_mul.fst --instances picorv32_pcpi_mul:picorv32_pcpi_mul 2>/dev/null" - -[[tests]] -name = "monitor.tests_serv_serv_regfile.serv_regfile_monitor" -paths = [ - "../../tests/serv/serv_regfile.prot", -] -expect_dir = "../../tests/serv/expects" -expect_name = "serv_regfile.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/serv/serv_regfile.prot --wave tests/serv/serv_regfile.fst --instances serv_regfile:Regfile --display-hex 2>/dev/null" - -[[tests]] -name = "monitor.tests_tinyaes128_aes128.aes128_monitor" -paths = [ - "../../tests/tinyaes128/aes128.prot", -] -expect_dir = "../../tests/tinyaes128/expects" -expect_name = "aes128.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/tinyaes128/aes128.prot --wave tests/tinyaes128/aes128.fst --instances aes_128:TinyAES128 --display-hex 2>/dev/null" - -[[tests]] -name = "monitor.tests_wal_advanced_axis.axis_monitor" -paths = [ - "../../tests/wal/advanced/axis.prot", -] -expect_dir = "../../tests/wal/advanced/expects" -expect_name = "axis.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wal/advanced/axis.prot --wave tests/wal/advanced/uart-axi.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_wal_advanced_axis_failing.axis_failing_monitor" -paths = [ - "../../tests/wal/advanced/axis_failing.prot", -] -expect_dir = "../../tests/wal/advanced/expects" -expect_name = "axis_failing.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wal/advanced/axis_failing.prot --wave tests/wal/advanced/uart-axi-minimal.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_wal_advanced_axis_minimal.axis_minimal_monitor" -paths = [ - "../../tests/wal/advanced/axis_minimal.prot", -] -expect_dir = "../../tests/wal/advanced/expects" -expect_name = "axis_minimal.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wal/advanced/axis_minimal.prot --wave tests/wal/advanced/uart-axi-minimal.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_wal_advanced_axis_truncated.axis_truncated_monitor" -paths = [ - "../../tests/wal/advanced/axis_truncated.prot", -] -expect_dir = "../../tests/wal/advanced/expects" -expect_name = "axis_truncated.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wal/advanced/axis_truncated.prot --wave tests/wal/advanced/uart-axi-truncated.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns 2>/dev/null" - -[[tests]] -name = "monitor.tests_wal_advanced_axis_truncated_include_idle.axis_truncated_include_idle_monitor" -paths = [ - "../../tests/wal/advanced/axis_truncated_include_idle.prot", -] -expect_dir = "../../tests/wal/advanced/expects" -expect_name = "axis_truncated_include_idle.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wal/advanced/axis_truncated_include_idle.prot --wave tests/wal/advanced/uart-axi-truncated.fst --instances uut_rx:AXIS --sample-posedge uut_rx.clk --show-waveform-time --time-unit ns --include-idle 2>/dev/null" - -[[tests]] -name = "monitor.tests_wb_intercon_wb_arb.wb_arb_monitor" -paths = [ - "../../tests/wb_intercon/wb_arb.prot", -] -expect_dir = "../../tests/wb_intercon/expects" -expect_name = "wb_arb.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wb_intercon/wb_arb.prot --instances wb_intercon_tb.wb_arb_tb:WBSubordinate --max-steps 1000 --sample-posedge wb_intercon_tb.wb_arb_tb.wb_clk --show-waveform-time --time-unit s 2>/dev/null" - -[[tests]] -name = "monitor.tests_wb_intercon_wb_cdc.wb_cdc_monitor" -paths = [ - "../../tests/wb_intercon/wb_cdc.prot", -] -expect_dir = "../../tests/wb_intercon/expects" -expect_name = "wb_cdc.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wb_intercon/wb_cdc.prot --wave tests/wb_intercon/wb_cdc.fst --instances wb_intercon_tb.wb_cdc_tb.dut:WBSubordinate --max-steps 1000 --sample-posedge wb_intercon_tb.wb_cdc_tb.dut.wbm_clk --show-waveform-time --time-unit s 2>/dev/null" - -[[tests]] -name = "monitor.tests_wishbone_wishbone_monitor.wishbone_monitor" -paths = [ - "../../tests/wishbone/wishbone.monitor.prot", -] -expect_dir = "../../tests/wishbone/expects" -expect_name = "wishbone.monitor.expect" -cmd = "cd ../.. && target/debug/protocols-monitor --protocol tests/wishbone/wishbone.monitor.prot --wave tests/wishbone/reqwalker.vcd --instances TOP.reqwalker:WBSubordinate --sample-posedge TOP.reqwalker.i_clk 2>/dev/null" diff --git a/scripts/benchmark_monitor.py b/scripts/benchmark_monitor.py deleted file mode 100644 index 9b90fd72..00000000 --- a/scripts/benchmark_monitor.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python3 -""" -Benchmarks the monitor on a range of test files using Hyperfine -(measuring CPU wall-clock time, averaged over 10 runs) and -creates a CSV with the results. -""" - -# Note: before running this script, first run -# `cargo build --release --package protocols-monitor` - -import csv -import json -import os -import re -import subprocess -import sys -from pathlib import Path - -from tqdm import tqdm - -sys.path.insert(0, str(Path(__file__).resolve().parent)) -import test_catalog # noqa: E402 - -OUTPUT_CSV = "benchmark_results/benchmark_results.csv" - - -def main(): - cases = sorted( - ( - { - "id": case_id, - "path": c["protocol"], - "wave": c.get("wave"), - "instances": c.get("instances", ()), - "extra_args": c.get("extra_args", ()), - } - for case_id, c in test_catalog.MONITOR_CASES.items() - ), - key=lambda case: (case["path"], case["id"]), - ) - - if not cases: - print("No monitor cases found in scripts/test_catalog.py") - return - - rows = [] - - for case in tqdm(cases, desc="Benchmarking", unit="case"): - # By default, Hyperfine executes the monitor for at least 10 - # times on each test file - cmd = [ - "hyperfine", - # Disable shell startup to avoid noise in measurements - "--shell=none", - "--export-json", - "tmp_hyperfine.json", - # Five warmup runs to run benchmarks on warm cache & avoid - # outliers between runs - "--warmup", - "5", - # Suppress hyperfine output (results are checked separately) - "--style", - "none", - # Ignore non-zero exit codes (some tests are expected to fail) - "--ignore-failure", - # Run the monitor directly on the catalog case. - " ".join(monitor_command(case)), - ] - - # Suppress monitor output to avoid measurement overhead - subprocess.run( - cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL - ) - - # Load hyperfine JSON - with open("tmp_hyperfine.json") as f: - data = json.load(f) - - result = data["results"][0] - mean_time = result["mean"] - stddev = result["stddev"] - min_time = result["min"] - max_time = result["max"] - - # Read the number of steps from the .prof file - prof_file = profile_path(case) - if not os.path.exists(prof_file): - # Skip tests without .prof files (e.g., tests expected to fail) - continue - - # Parse lines beginning with "No. of steps taken..." and extract the integer - # Example: "No. of steps taken by AxisFifo scheduler: 74" -> 74 - num_steps = None - pattern = re.compile(r"^No\. of steps taken.*:\s*(\d+)") - - with open(prof_file) as f: - for line in f: - match = pattern.match(line) - if match: - num_steps = int(match.group(1)) - break # Use the first matching line - - if num_steps is None: - # Skip if no step count found - continue - - # Normalize times by number of steps - mean_time_per_step = mean_time / num_steps - stddev_per_step = stddev / num_steps - min_time_per_step = min_time / num_steps - max_time_per_step = max_time / num_steps - - # Compute throughput (steps per second) - steps_per_sec = 1.0 / mean_time_per_step - - base = os.path.basename(case["path"]) - if base.endswith(".prot"): - base = base[:-5] # strip .prot - - rows.append( - [ - case["path"], - base, - num_steps, - mean_time_per_step, - stddev_per_step, - min_time_per_step, - max_time_per_step, - steps_per_sec, - ] - ) - - # ---- Write CSV ---- - os.makedirs(os.path.dirname(OUTPUT_CSV), exist_ok=True) - with open(OUTPUT_CSV, "w", newline="") as f: - writer = csv.writer(f) - writer.writerow( - [ - "file_path", - "test_name", - "num_steps", - "mean_per_step", - "stddev_per_step", - "min_per_step", - "max_per_step", - "steps_per_sec", - ] - ) - writer.writerows(rows) - - print(f"\nWrote results to {OUTPUT_CSV}") - - -def monitor_command(case): - cmd = ["cargo", "monitor", "--protocol", case["path"]] - if case["wave"]: - cmd += ["--wave", case["wave"]] - if case["instances"]: - cmd += ["--instances", *case["instances"]] - cmd += case["extra_args"] - return cmd - - -def profile_path(case): - candidates = [Path(case["path"]).with_suffix(".prof")] - wave = case.get("wave") - if isinstance(wave, str): - candidates.append(Path(wave).with_suffix(".prof")) - for candidate in candidates: - if candidate.exists(): - return str(candidate) - return str(candidates[0]) - - -if __name__ == "__main__": - main() diff --git a/scripts/check_performance_regression.py b/scripts/check_performance_regression.py deleted file mode 100644 index abeaaeec..00000000 --- a/scripts/check_performance_regression.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -""" -Check for performance regressions in the monitor -by comparing current benchmark results with a baseline (the existing CSV -in the `benchmark_results` sub-directory). -""" - -import csv -import sys -import os - -BASELINE_CSV = "benchmark_results/baseline_results.csv" -CURRENT_CSV = "benchmark_results/benchmark_results.csv" -REGRESSION_THRESHOLD = 0.10 # 10% slower is considered a regression - - -def load_results(csv_path): - """Load benchmark results from CSV into a dict keyed by test_name.""" - results = {} - with open(csv_path) as f: - reader = csv.DictReader(f) - for row in reader: - test_name = row["test_name"] - results[test_name] = { - "mean_per_step": float(row["mean_per_step"]), - "stddev_per_step": float(row["stddev_per_step"]), - "min_per_step": float(row["min_per_step"]), - "max_per_step": float(row["max_per_step"]), - "steps_per_sec": float(row["steps_per_sec"]), - } - return results - - -def main(): - if not os.path.exists(BASELINE_CSV): - print(f"No baseline found at {BASELINE_CSV}") - print("Creating baseline from current results...") - # Copy current results as baseline - os.makedirs(os.path.dirname(BASELINE_CSV), exist_ok=True) - with open(CURRENT_CSV) as src, open(BASELINE_CSV, "w") as dst: - dst.write(src.read()) - print(f"Baseline saved to {BASELINE_CSV}") - return 0 - - baseline = load_results(BASELINE_CSV) - current = load_results(CURRENT_CSV) - - regressions = [] - improvements = [] - - print("\n=== Performance Comparison ===\n") - - for test_name in sorted(current.keys()): - if test_name not in baseline: - steps_per_sec = current[test_name]["steps_per_sec"] - print(f"NEW: {test_name}: {steps_per_sec:.2f} steps/sec") - continue - - # Read pre-computed throughput (steps per second) - baseline_throughput = baseline[test_name]["steps_per_sec"] - current_throughput = current[test_name]["steps_per_sec"] - - # Calculate percentage change (positive = improvement, negative = regression) - pct_change = ( - (current_throughput - baseline_throughput) / baseline_throughput - ) * 100 - - status = "=" - if pct_change < -REGRESSION_THRESHOLD * 100: - # Throughput decreased by more than threshold = regression - status = "REGRESSION" - regressions.append( - (test_name, baseline_throughput, current_throughput, pct_change) - ) - elif pct_change > REGRESSION_THRESHOLD * 100: - # Throughput increased by more than threshold = improvement - status = "IMPROVEMENT" - improvements.append( - (test_name, baseline_throughput, current_throughput, pct_change) - ) - - print( - f"{status:12} {test_name:30} {baseline_throughput:7.2f} -> {current_throughput:7.2f} steps/sec ({pct_change:+6.2f}%)" - ) - - print() - - if regressions: - print(f"\nFound {len(regressions)} performance regression(s):") - for ( - test_name, - baseline_throughput, - current_throughput, - pct_change, - ) in regressions: - print( - f" - {test_name}: {baseline_throughput:.2f} -> {current_throughput:.2f} steps/sec ({pct_change:+.2f}%)" - ) - return 1 - - if improvements: - print(f"\nFound {len(improvements)} performance improvement(s):") - for ( - test_name, - baseline_throughput, - current_throughput, - pct_change, - ) in improvements: - print( - f" - {test_name}: {baseline_throughput:.2f} -> {current_throughput:.2f} steps/sec ({pct_change:+.2f}%)" - ) - - print("\nNo performance regressions detected!") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/scripts/generate_runt_configs.py b/scripts/generate_runt_configs.py index 480f9438..c2df419f 100644 --- a/scripts/generate_runt_configs.py +++ b/scripts/generate_runt_configs.py @@ -43,18 +43,16 @@ def load_tx_cases() -> list[dict]: return out -def load_monitor_cases() -> list[dict]: - """Same idea as load_tx_cases but for the monitor cases""" +def load_bi_cases() -> list[dict]: + """Same idea as load_tx_cases but for the bi cases""" out = [] - for case_id, c in test_catalog.MONITOR_CASES.items(): + for case_id, c in test_catalog.BI_CASES.items(): out.append( { "id": case_id, "path": c["protocol"], "wave": c.get("wave"), "instances": c.get("instances", ()), - "max_steps": c.get("max_steps"), - "timeout_secs": c.get("timeout_secs"), "extra_args": c.get("extra_args", ()), "expected": c["expect"], } @@ -73,13 +71,13 @@ def replace_non_alphanumerics(value: object) -> str: def case_stem(case: dict) -> str: - # antmicro monitor cases share one .prot but differ by wave, so name them by - # the wave; otherwise use the test file's stem (dropping a .monitor suffix). + # antmicro cases share one .prot but differ by wave, so name them by + # the wave; otherwise use the test file's stem (dropping a .bi suffix). wave = case.get("wave") if wave and case["path"].startswith("tests/antmicro/"): return Path(wave).stem stem = Path(case["path"]).stem - return stem.removesuffix(".monitor") + return stem.removesuffix(".bi") def expect_name(case: dict, runner: str) -> str: @@ -91,7 +89,7 @@ def expect_name(case: dict, runner: str) -> str: def expect_dir(case: dict, runner: str) -> str: wave = case.get("wave") - base = Path(wave if runner == "monitor" and wave else case["path"]).parent + base = Path(wave if runner == "bi" and wave else case["path"]).parent return f"../../{base.as_posix()}/expects" @@ -105,7 +103,7 @@ def binary_prefix(binary: str) -> list[str]: def repo_root_command(cmd: list[str], stderr: str = "discard") -> str: # Each runt test runs exactly one path, so we bake it straight into the # command. Runt captures stdout; interp snapshots intentionally include - # diagnostics, while monitor/graph snapshots historically discard stderr. + # diagnostics, while graph snapshots historically discard stderr. if stderr == "stdout": tail = " 2>&1" elif stderr == "discard": @@ -119,7 +117,7 @@ def repo_root_command(cmd: list[str], stderr: str = "discard") -> str: def timeout_cmd(timeout_secs: int, cmd: list[str]) -> list[str]: # Runt doesn't support expected timeouts, so we have to have this wrapper - # on the interp/monitor commands + # on the interp/bi commands # Run in a new process group and kill the whole group (cargo's child binary # included) on expiry, exiting 124 to match coreutils. script = ( @@ -181,18 +179,18 @@ def graph_interp_runt_command(case: dict) -> list[tuple[str, str]]: return [(suffix, repo_root_command(cmd + flags)) for suffix, flags in flag_sets] -def monitor_runt_command(case: dict) -> list[tuple[str, str]]: - cmd = [*binary_prefix("protocols-monitor"), "--protocol", case["path"]] +def bi_runt_command(case: dict) -> list[tuple[str, str]]: + # We pass in `--color never` to BI to suppress color in error messages + # (so that the .expect files only display plaintext) + cmd = [*binary_prefix("bi"), "--color", "never", "--protocol", case["path"]] if case["wave"]: cmd += ["--wave", case["wave"]] if case["instances"]: cmd += ["--instances", *case["instances"]] - if case["max_steps"] is not None: - cmd += ["--max-steps", str(case["max_steps"])] cmd += case["extra_args"] - if case["timeout_secs"] is not None: - cmd = timeout_cmd(case["timeout_secs"], cmd) - return [("", repo_root_command(cmd))] + # We redirect stderr to stdout so that the expected output files + # contain error messages if BI fails + return [("", repo_root_command(cmd, stderr="stdout"))] def waveform_runt_command(case: dict) -> list[tuple[str, str]]: @@ -260,7 +258,7 @@ def fail_runt_command(case: dict) -> list[tuple[str, str]]: RUNT_BUILDERS = { "interp": interp_runt_command, "graph_interp": graph_interp_runt_command, - "monitor": monitor_runt_command, + "bi": bi_runt_command, "waveform": waveform_runt_command, "fail": fail_runt_command, } @@ -382,12 +380,12 @@ def write_runt_toml(output_dir: Path, suites) -> None: def generate_runt_configs() -> None: tx = load_tx_cases() - mon = load_monitor_cases() - # Each suite maps a name to (runner, cases). interp + monitor + graph_interp + bi = load_bi_cases() + # Each suite maps a name to (runner, cases). interp + graph_interp # together cover every test. suite_specs = { "interp": ("interp", tx), - "monitor": ("monitor", mon), + "bi": ("bi", bi), "graph_interp": ("graph_interp", graph_interp_cases(tx)), "waveform": ("waveform", waveform_cases(tx)), "fail": ("fail", fail_cases(tx)), diff --git a/scripts/plot_benchmark_results.py b/scripts/plot_benchmark_results.py deleted file mode 100644 index 65e99094..00000000 --- a/scripts/plot_benchmark_results.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python3 -""" -Plots the data in `INPUT_CSV` as a scatter plot, saving it in `OUTPUT_PNG` -""" - -import csv -import math -import matplotlib.pyplot as plt - -INPUT_CSV = "benchmark_results/benchmark_results.csv" -OUTPUT_PNG = "benchmark_results/benchmark_plot.png" - - -def main(): - names = [] - steps_per_sec = [] - - with open(INPUT_CSV) as f: - reader = csv.DictReader(f) - for row in reader: - names.append(row["test_name"]) - # Read pre-computed throughput (steps per second) - steps_per_sec.append(float(row["steps_per_sec"])) - - # Determine min/max values on the y-axis, round them to nearest multiple of 10 - min_steps_per_sec = min(steps_per_sec) - max_steps_per_sec = max(steps_per_sec) - ymin = math.floor(min_steps_per_sec / 10.0) * 10.0 - ymax = math.ceil(max_steps_per_sec / 10.0) * 10.0 - - # Create ticks for every 200 units on the y-axis - yticks = list(range(int(ymin), int(ymax) + 1, 200)) - - plt.figure(figsize=(12, 8)) - plt.scatter(names, steps_per_sec) - - plt.title("Monitor throughput on benchmarks (higher is better)") - plt.xlabel("Test File") - plt.ylabel("Mean no. of Steps (clock cycles) per second") - plt.xticks(rotation=45, ha="right") - plt.yticks(yticks) - - plt.grid(zorder=1, linestyle="--", alpha=0.6) - plt.tight_layout() - plt.savefig(OUTPUT_PNG) - - print(f"Saved plot to {OUTPUT_PNG}") - - plt.close() - - -if __name__ == "__main__": - main() diff --git a/scripts/test_catalog.py b/scripts/test_catalog.py index ff56b960..571e0221 100644 --- a/scripts/test_catalog.py +++ b/scripts/test_catalog.py @@ -1,7 +1,7 @@ # Checked-in test catalog. Hand-maintained source of truth. -# Consumed by scripts/generate_runt_configs.py and scripts/benchmark_monitor.py. +# Consumed by scripts/generate_runt_configs.py. # -# TX_CASES are keyed by their .tx path. MONITOR_CASES are keyed by a unique id +# TX_CASES are keyed by their .tx path. BI_CASES are keyed by a unique id TX_CASES = { "examples/picorv32/unsigned_mul.tx": { @@ -89,16 +89,6 @@ "verilog": ("tests/adders/adder_d1/add_d1.v",), "expect": "pass", }, - "tests/adders/adder_d1/busy_wait_fail.tx": { - "protocol": "tests/adders/adder_d1/busy_wait.prot", - "verilog": ("tests/adders/adder_d1/add_d1.v",), - "expect": "assertion_mismatch", - }, - "tests/adders/adder_d1/busy_wait_pass.tx": { - "protocol": "tests/adders/adder_d1/busy_wait.prot", - "verilog": ("tests/adders/adder_d1/add_d1.v",), - "expect": "pass", - }, "tests/adders/adder_d1/assign_after_observation.tx": { "protocol": "tests/adders/adder_d1/add_d1.prot", "verilog": ("tests/adders/adder_d1/add_d1.v",), @@ -132,16 +122,6 @@ "expect": "fork_protocol_error", "extra_args": ("--skip-static-step-fork-checks",), }, - "tests/adders/adder_d1/loop_with_assigns.tx": { - "protocol": "tests/adders/adder_d1/loop_with_assigns.prot", - "verilog": ("tests/adders/adder_d1/add_d1.v",), - "expect": "pass", - }, - "tests/adders/adder_d1/nested_busy_wait.tx": { - "protocol": "tests/adders/adder_d1/nested_busy_wait.prot", - "verilog": ("tests/adders/adder_d1/add_d1.v",), - "expect": "pass", - }, "tests/adders/adder_d1/second_thread_fails.tx": { "protocol": "tests/adders/adder_d1/add_d1.prot", "verilog": ("tests/adders/adder_d1/add_d1.v",), @@ -325,30 +305,6 @@ "top": "fifo_wrapper", "expect": "pass", }, - "tests/fifo/push_pop_loop_empty.tx": { - "protocol": "tests/fifo/fifo_bounded_loop.prot", - "verilog": ( - "tests/fifo/bsg_mem_1rw_sync.v", - "tests/fifo/bsg_mem_1rw_sync_synth.v", - "tests/fifo/bsg_circular_ptr.v", - "tests/fifo/bsg_fifo_1rw_large.v", - "tests/fifo/fifo_wrapper.v", - ), - "top": "fifo_wrapper", - "expect": "pass", - }, - "tests/fifo/push_pop_loop_not_empty.tx": { - "protocol": "tests/fifo/fifo_bounded_loop.prot", - "verilog": ( - "tests/fifo/bsg_mem_1rw_sync.v", - "tests/fifo/bsg_mem_1rw_sync_synth.v", - "tests/fifo/bsg_circular_ptr.v", - "tests/fifo/bsg_fifo_1rw_large.v", - "tests/fifo/fifo_wrapper.v", - ), - "top": "fifo_wrapper", - "expect": "pass", - }, "tests/identities/dual_identity_d0/dual_identity_d0_combdep.tx": { "protocol": "tests/identities/dual_identity_d0/dual_identity_d0.prot", "verilog": ("tests/identities/dual_identity_d0/dual_identity_d0.v",), @@ -501,7 +457,7 @@ }, } -MONITOR_CASES = { +BI_CASES = { "tests.adders.add_d1": { "protocol": "tests/adders/add_d1.prot", "wave": "tests/adders/add_d1.fst", @@ -520,33 +476,14 @@ "instances": ("add_d1:Adder",), "expect": "pass", }, - "tests.adders.busy_wait": { - "protocol": "tests/adders/busy_wait.prot", - "wave": "tests/adders/busy_wait.fst", - "instances": ("add_d1:Adder",), - "expect": "pass", - }, - "tests.adders.loop_with_assigns": { - "protocol": "tests/adders/loop_with_assigns.prot", - "wave": "tests/adders/loop_with_assigns.fst", - "instances": ("add_d1:Adder",), - "expect": "pass", - }, - "tests.adders.nested_busy_wait": { - "protocol": "tests/adders/nested_busy_wait.prot", - "wave": "tests/adders/nested_busy_wait.fst", - "instances": ("add_d1:Adder",), - "expect": None, - "timeout_secs": 5, - }, - "tests.alus.alu_d1.monitor": { - "protocol": "tests/alus/alu_d1.monitor.prot", + "tests.alus.alu_d1.bi": { + "protocol": "tests/alus/alu_d1.bi.prot", "wave": "tests/alus/alu_d1.fst", "instances": ("alu_d1:ALU",), "expect": "pass", }, - "tests.alus.alu_d2.monitor": { - "protocol": "tests/alus/alu_d2.monitor.prot", + "tests.alus.alu_d2.bi": { + "protocol": "tests/alus/alu_d2.bi.prot", "wave": "tests/alus/alu_d2.fst", "instances": ("alu_d2:ALU",), "expect": "pass", @@ -605,8 +542,8 @@ "ns", ), }, - "tests.fifo.fifo.monitor": { - "protocol": "tests/fifo/fifo.monitor.prot", + "tests.fifo.fifo.bi": { + "protocol": "tests/fifo/fifo.bi.prot", "wave": "tests/fifo/fifo.fst", "instances": ("fifo_wrapper:Fifo",), "expect": "pass", @@ -617,20 +554,6 @@ "instances": ("fifo_wrapper:Fifo",), "expect": "pass", }, - "tests.fifo.push_pop_loop_empty": { - "protocol": "tests/fifo/push_pop_loop_empty.prot", - "wave": "tests/fifo/push_pop_loop_empty.fst", - "instances": ("fifo_wrapper:Fifo",), - "expect": None, - "timeout_secs": 5, - }, - "tests.fifo.push_pop_loop_not_empty": { - "protocol": "tests/fifo/push_pop_loop_not_empty.prot", - "wave": "tests/fifo/push_pop_loop_not_empty.fst", - "instances": ("fifo_wrapper:Fifo",), - "expect": None, - "timeout_secs": 5, - }, "tests.fpga-debugging.axi-burst-s4.s4_buggy": { "protocol": "tests/fpga-debugging/axi-burst-s4/s4_buggy.prot", "wave": "tests/fpga-debugging/axi-burst-s4/s4_buggy.vcd", @@ -1048,8 +971,8 @@ "s", ), }, - "tests.wishbone.wishbone.monitor": { - "protocol": "tests/wishbone/wishbone.monitor.prot", + "tests.wishbone.wishbone.bi": { + "protocol": "tests/wishbone/wishbone.bi.prot", "wave": "tests/wishbone/reqwalker.vcd", "instances": ("TOP.reqwalker:WBSubordinate",), "expect": "pass", @@ -1093,7 +1016,7 @@ def _antmicro_case(stem): } -MONITOR_CASES.update( +BI_CASES.update( { f"tests.antmicro.{stem.replace('/', '.')}": _antmicro_case(stem) for stem in ANTMICRO_TRACE_STEMS diff --git a/tests/adders/adder_d1/busy_wait.prot b/tests/adders/adder_d1/busy_wait.prot deleted file mode 100644 index c6aefb80..00000000 --- a/tests/adders/adder_d1/busy_wait.prot +++ /dev/null @@ -1,29 +0,0 @@ -// Maps to a Verilog design -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -// Uses a bounded loop that busy-waits for `num_iters` cycles. -// Since concrete assignments to DUT input ports persist, -// calling `step()` multiple times in the loop with the same inputs -// should still produce the correct result on the adder. (This allows us to -// reuse the same Verilog file as the other `adder_d1` tests.) -prot add_busy_wait(a: u32, b: u32, num_iters: uint, s: u32) { - DUT.a := a; - DUT.b := b; - // We want `assert_eq(s, DUT.s)` to hold for every iteration of this loop, - // so we cannot put `DUT.a := X; DUT.b := X` in the loop body, since - // that would cause the `assert_eq` to fail on later iterations of the loop - repeat num_iters iterations { - step(); - assert_eq(s, DUT.s); - } - DUT.a := X; - DUT.b := X; - // Ensure `s = a + b` still holds when we exit the loop - assert_eq(s, DUT.s); - fork(); - step(); -} diff --git a/tests/adders/adder_d1/busy_wait_fail.tx b/tests/adders/adder_d1/busy_wait_fail.tx deleted file mode 100644 index 965847fe..00000000 --- a/tests/adders/adder_d1/busy_wait_fail.tx +++ /dev/null @@ -1,3 +0,0 @@ -trace { - add_busy_wait(1, 2, 2, 999); // Wrong output value, this transaction fails -} diff --git a/tests/adders/adder_d1/busy_wait_pass.tx b/tests/adders/adder_d1/busy_wait_pass.tx deleted file mode 100644 index 1e34282c..00000000 --- a/tests/adders/adder_d1/busy_wait_pass.tx +++ /dev/null @@ -1,4 +0,0 @@ -trace { - add_busy_wait(1, 2, 1, 3); // Runs busy-waiting loop for 1 iteration - add_busy_wait(4, 5, 3, 9); // Runs busy-waiting loop for 3 iterations -} diff --git a/tests/adders/adder_d1/expects/busy_wait_fail.interp.expect b/tests/adders/adder_d1/expects/busy_wait_fail.interp.expect deleted file mode 100644 index 6778966d..00000000 --- a/tests/adders/adder_d1/expects/busy_wait_fail.interp.expect +++ /dev/null @@ -1,9 +0,0 @@ -error: The two expressions did not evaluate to the same value (in transaction `add_busy_wait(1, 2, 2, 999)`) - ┌─ tests/adders/adder_d1/busy_wait.prot:21:15 - │ -21 │ assert_eq(s, DUT.s); - │ ^^^^^^^^ LHS Value: 999, RHS Value: 3 - -Trace 0 execution failed. ----CODE--- -101 diff --git a/tests/adders/adder_d1/expects/busy_wait_pass.interp.expect b/tests/adders/adder_d1/expects/busy_wait_pass.interp.expect deleted file mode 100644 index f5f6cb49..00000000 --- a/tests/adders/adder_d1/expects/busy_wait_pass.interp.expect +++ /dev/null @@ -1 +0,0 @@ -Trace 0 executed successfully! diff --git a/tests/adders/adder_d1/expects/loop_with_assigns.interp.expect b/tests/adders/adder_d1/expects/loop_with_assigns.interp.expect deleted file mode 100644 index f5f6cb49..00000000 --- a/tests/adders/adder_d1/expects/loop_with_assigns.interp.expect +++ /dev/null @@ -1 +0,0 @@ -Trace 0 executed successfully! diff --git a/tests/adders/adder_d1/expects/nested_busy_wait.interp.expect b/tests/adders/adder_d1/expects/nested_busy_wait.interp.expect deleted file mode 100644 index f5f6cb49..00000000 --- a/tests/adders/adder_d1/expects/nested_busy_wait.interp.expect +++ /dev/null @@ -1 +0,0 @@ -Trace 0 executed successfully! diff --git a/tests/adders/adder_d1/loop_with_assigns.prot b/tests/adders/adder_d1/loop_with_assigns.prot deleted file mode 100644 index 82255a81..00000000 --- a/tests/adders/adder_d1/loop_with_assigns.prot +++ /dev/null @@ -1,22 +0,0 @@ -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -// Each iteration of the loop performs the full add protocol: -// assign inputs -> step -> release inputs -> assert output -// This tests that assignments, DontCare releases, and assertions -// all work correctly inside a bounded loop body. -prot loop_add(a: u32, b: u32, num_iters: uint, s: u32) { - repeat num_iters iterations { - DUT.a := a; - DUT.b := b; - step(); - DUT.a := X; - DUT.b := X; - assert_eq(s, DUT.s); - } - fork(); - step(); -} diff --git a/tests/adders/adder_d1/loop_with_assigns.tx b/tests/adders/adder_d1/loop_with_assigns.tx deleted file mode 100644 index b3941543..00000000 --- a/tests/adders/adder_d1/loop_with_assigns.tx +++ /dev/null @@ -1,4 +0,0 @@ -trace { - loop_add(1, 2, 3, 3); // assert 1+2=3 on each of 3 iterations - loop_add(10, 20, 1, 30); // assert 10+20=30 on 1 iteration -} diff --git a/tests/adders/adder_d1/nested_busy_wait.prot b/tests/adders/adder_d1/nested_busy_wait.prot deleted file mode 100644 index 908ec3ab..00000000 --- a/tests/adders/adder_d1/nested_busy_wait.prot +++ /dev/null @@ -1,28 +0,0 @@ -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -// Nested bounded loops: the outer loop runs `outer_iters` times, -// and the inner loop runs `inner_iters` times per outer iteration, -// for a total of `outer_iters * inner_iters` steps. -// Since inputs are sticky on the adder, the final result is -// the same regardless of how many steps we take. -prot nested_busy_wait(a: u32, b: u32, outer_iters: uint, inner_iters: uint, s: u32) { - DUT.a := a; - DUT.b := b; - repeat outer_iters iterations { - repeat inner_iters iterations { - step(); - assert_eq(s, DUT.s); - } - step(); - assert_eq(s, DUT.s); - } - DUT.a := X; - DUT.b := X; - assert_eq(s, DUT.s); - fork(); - step(); -} diff --git a/tests/adders/adder_d1/nested_busy_wait.tx b/tests/adders/adder_d1/nested_busy_wait.tx deleted file mode 100644 index 75d86ba3..00000000 --- a/tests/adders/adder_d1/nested_busy_wait.tx +++ /dev/null @@ -1,4 +0,0 @@ -trace { - nested_busy_wait(1, 2, 2, 3, 3); // 6 inner steps + 2 outer steps = 8 cycles - nested_busy_wait(10, 20, 3, 2, 30); // 6 inner steps + 3 outer steps = 9 cycles -} diff --git a/tests/adders/busy_wait.fst b/tests/adders/busy_wait.fst deleted file mode 100644 index 4349baaf..00000000 Binary files a/tests/adders/busy_wait.fst and /dev/null differ diff --git a/tests/adders/busy_wait.prof b/tests/adders/busy_wait.prof deleted file mode 100644 index 33af911e..00000000 --- a/tests/adders/busy_wait.prof +++ /dev/null @@ -1 +0,0 @@ -No. of steps taken by Adder scheduler: 4 diff --git a/tests/adders/busy_wait.prot b/tests/adders/busy_wait.prot deleted file mode 100644 index e328dfe8..00000000 --- a/tests/adders/busy_wait.prot +++ /dev/null @@ -1,28 +0,0 @@ -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -// Uses a bounded loop that busy-waits for `num_iters` cycles. -// Since concrete assignments to DUT input ports persist, -// calling `step()` multiple times in the loop with the same inputs -// should still produce the correct result on the adder. (This allows us to -// reuse the same Verilog file as the other `adder_d1` tests.) -prot add_busy_wait(a: u32, b: u32, num_iters: uint, s: u32) { - DUT.a := a; - DUT.b := b; - // We want `assert_eq(s, DUT.s)` to hold for every iteration of this loop, - // so we cannot put `DUT.a := X; DUT.b := X` in the loop body, since - // that would cause the `assert_eq` to fail on later iterations of the loop - repeat num_iters iterations { - step(); - assert_eq(s, DUT.s); - } - DUT.a := X; - DUT.b := X; - // Ensure `s = a + b` still holds when we exit the loop - assert_eq(s, DUT.s); - fork(); - step(); -} diff --git a/tests/adders/expects/add_d1.monitor.expect b/tests/adders/expects/add_d1.bi.expect similarity index 100% rename from tests/adders/expects/add_d1.monitor.expect rename to tests/adders/expects/add_d1.bi.expect diff --git a/tests/adders/expects/add_d2.monitor.expect b/tests/adders/expects/add_d2.bi.expect similarity index 100% rename from tests/adders/expects/add_d2.monitor.expect rename to tests/adders/expects/add_d2.bi.expect diff --git a/tests/adders/expects/add_var_cyc.monitor.expect b/tests/adders/expects/add_var_cyc.bi.expect similarity index 100% rename from tests/adders/expects/add_var_cyc.monitor.expect rename to tests/adders/expects/add_var_cyc.bi.expect index 1f54e4cf..3d640dc7 100644 --- a/tests/adders/expects/add_var_cyc.monitor.expect +++ b/tests/adders/expects/add_var_cyc.bi.expect @@ -1,19 +1,20 @@ // trace 0 trace { - loop_add(1, 2, 3, 2); + loop_add(1, 2, 3, 1); + loop_add(1, 2, 3, 0); loop_add(10, 20, 30, 0); } // trace 1 trace { - loop_add(1, 2, 3, 0); - loop_add(1, 2, 3, 1); + loop_add(1, 2, 3, 2); loop_add(10, 20, 30, 0); } // trace 2 trace { - loop_add(1, 2, 3, 1); + loop_add(1, 2, 3, 0); + loop_add(1, 2, 3, 0); loop_add(1, 2, 3, 0); loop_add(10, 20, 30, 0); } @@ -21,7 +22,6 @@ trace { // trace 3 trace { loop_add(1, 2, 3, 0); - loop_add(1, 2, 3, 0); - loop_add(1, 2, 3, 0); + loop_add(1, 2, 3, 1); loop_add(10, 20, 30, 0); } diff --git a/tests/adders/expects/busy_wait.monitor.expect b/tests/adders/expects/busy_wait.monitor.expect deleted file mode 100644 index dd10c482..00000000 --- a/tests/adders/expects/busy_wait.monitor.expect +++ /dev/null @@ -1,12 +0,0 @@ -// trace 0 -trace { - add_busy_wait(1, 2, 1, 3); - add_busy_wait(4, 5, 2, 9); -} - -// trace 1 -trace { - add_busy_wait(1, 2, 1, 3); - add_busy_wait(4, 5, 1, 9); - add_busy_wait(4, 5, 1, 9); -} diff --git a/tests/adders/expects/loop_with_assigns.monitor.expect b/tests/adders/expects/loop_with_assigns.monitor.expect deleted file mode 100644 index 95bdea3c..00000000 --- a/tests/adders/expects/loop_with_assigns.monitor.expect +++ /dev/null @@ -1,31 +0,0 @@ -// trace 0 -trace { - loop_add(1, 2, 3, 3); - loop_add(10, 20, 1, 30); - loop_add(198490043, 4254467669, 1, 30); -} - -// trace 1 -trace { - loop_add(1, 2, 1, 3); - loop_add(1, 2, 2, 3); - loop_add(10, 20, 1, 30); - loop_add(198490043, 4254467669, 1, 30); -} - -// trace 2 -trace { - loop_add(1, 2, 2, 3); - loop_add(1, 2, 1, 3); - loop_add(10, 20, 1, 30); - loop_add(198490043, 4254467669, 1, 30); -} - -// trace 3 -trace { - loop_add(1, 2, 1, 3); - loop_add(1, 2, 1, 3); - loop_add(1, 2, 1, 3); - loop_add(10, 20, 1, 30); - loop_add(198490043, 4254467669, 1, 30); -} diff --git a/tests/adders/expects/nested_busy_wait.monitor.expect b/tests/adders/expects/nested_busy_wait.monitor.expect deleted file mode 100644 index 5b85e011..00000000 --- a/tests/adders/expects/nested_busy_wait.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -124 diff --git a/tests/adders/loop_with_assigns.prot b/tests/adders/loop_with_assigns.prot deleted file mode 100644 index 82255a81..00000000 --- a/tests/adders/loop_with_assigns.prot +++ /dev/null @@ -1,22 +0,0 @@ -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -// Each iteration of the loop performs the full add protocol: -// assign inputs -> step -> release inputs -> assert output -// This tests that assignments, DontCare releases, and assertions -// all work correctly inside a bounded loop body. -prot loop_add(a: u32, b: u32, num_iters: uint, s: u32) { - repeat num_iters iterations { - DUT.a := a; - DUT.b := b; - step(); - DUT.a := X; - DUT.b := X; - assert_eq(s, DUT.s); - } - fork(); - step(); -} diff --git a/tests/adders/nested_busy_wait.fst b/tests/adders/nested_busy_wait.fst deleted file mode 100644 index 4c711db4..00000000 Binary files a/tests/adders/nested_busy_wait.fst and /dev/null differ diff --git a/tests/adders/nested_busy_wait.prof b/tests/adders/nested_busy_wait.prof deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/adders/nested_busy_wait.prot b/tests/adders/nested_busy_wait.prot deleted file mode 100644 index 908ec3ab..00000000 --- a/tests/adders/nested_busy_wait.prot +++ /dev/null @@ -1,28 +0,0 @@ -struct Adder { - in a: u32, - in b: u32, - out s: u32, -} - -// Nested bounded loops: the outer loop runs `outer_iters` times, -// and the inner loop runs `inner_iters` times per outer iteration, -// for a total of `outer_iters * inner_iters` steps. -// Since inputs are sticky on the adder, the final result is -// the same regardless of how many steps we take. -prot nested_busy_wait(a: u32, b: u32, outer_iters: uint, inner_iters: uint, s: u32) { - DUT.a := a; - DUT.b := b; - repeat outer_iters iterations { - repeat inner_iters iterations { - step(); - assert_eq(s, DUT.s); - } - step(); - assert_eq(s, DUT.s); - } - DUT.a := X; - DUT.b := X; - assert_eq(s, DUT.s); - fork(); - step(); -} diff --git a/tests/alus/alu_d1.monitor.prot b/tests/alus/alu_d1.bi.prot similarity index 100% rename from tests/alus/alu_d1.monitor.prot rename to tests/alus/alu_d1.bi.prot diff --git a/tests/alus/alu_d2.monitor.prot b/tests/alus/alu_d2.bi.prot similarity index 100% rename from tests/alus/alu_d2.monitor.prot rename to tests/alus/alu_d2.bi.prot diff --git a/tests/alus/expects/alu_d1.monitor.expect b/tests/alus/expects/alu_d1.bi.expect similarity index 100% rename from tests/alus/expects/alu_d1.monitor.expect rename to tests/alus/expects/alu_d1.bi.expect diff --git a/tests/alus/expects/alu_d2.monitor.expect b/tests/alus/expects/alu_d2.bi.expect similarity index 100% rename from tests/alus/expects/alu_d2.monitor.expect rename to tests/alus/expects/alu_d2.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_1.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_1.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_1.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_1.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_2.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_2.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_2.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_2.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_3.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_3.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_3.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_3.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_4.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_4.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_4.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_4.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_5.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_5.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_5.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_5.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_6.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_6.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_6.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_6.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_7.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_7.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_7.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_7.bi.expect diff --git a/tests/antmicro/fifo_classic/expects/test_fifo_classic_8.monitor.expect b/tests/antmicro/fifo_classic/expects/test_fifo_classic_8.bi.expect similarity index 100% rename from tests/antmicro/fifo_classic/expects/test_fifo_classic_8.monitor.expect rename to tests/antmicro/fifo_classic/expects/test_fifo_classic_8.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_1.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_1.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_1.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_1.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_2.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_2.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_2.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_2.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_3.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_3.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_3.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_3.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_4.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_4.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_4.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_4.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_5.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_5.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_5.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_5.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_6.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_6.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_6.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_6.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_7.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_7.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_7.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_7.bi.expect diff --git a/tests/antmicro/fifo_constant/expects/test_fifo_constant_8.monitor.expect b/tests/antmicro/fifo_constant/expects/test_fifo_constant_8.bi.expect similarity index 100% rename from tests/antmicro/fifo_constant/expects/test_fifo_constant_8.monitor.expect rename to tests/antmicro/fifo_constant/expects/test_fifo_constant_8.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_16_0.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_16_0.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_16_0.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_16_0.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_16_12.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_16_12.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_16_12.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_16_12.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_16_4.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_16_4.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_16_4.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_16_4.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_16_8.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_16_8.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_16_8.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_16_8.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_1_0.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_1_0.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_1_0.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_1_0.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_1_12.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_1_12.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_1_12.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_1_12.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_1_4.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_1_4.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_1_4.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_1_4.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_1_8.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_1_8.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_1_8.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_1_8.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_2_0.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_2_0.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_2_0.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_2_0.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_2_12.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_2_12.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_2_12.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_2_12.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_2_4.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_2_4.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_2_4.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_2_4.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_2_8.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_2_8.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_2_8.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_2_8.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_4_0.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_4_0.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_4_0.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_4_0.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_4_12.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_4_12.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_4_12.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_4_12.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_4_4.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_4_4.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_4_4.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_4_4.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_4_8.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_4_8.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_4_8.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_4_8.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_8_0.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_8_0.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_8_0.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_8_0.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_8_12.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_8_12.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_8_12.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_8_12.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_8_4.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_8_4.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_8_4.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_8_4.bi.expect diff --git a/tests/antmicro/sram_classic/expects/test_sram_classic_8_8.monitor.expect b/tests/antmicro/sram_classic/expects/test_sram_classic_8_8.bi.expect similarity index 100% rename from tests/antmicro/sram_classic/expects/test_sram_classic_8_8.monitor.expect rename to tests/antmicro/sram_classic/expects/test_sram_classic_8_8.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_0_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_12_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_4_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_16_8_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_0_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_12_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_4_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_1_8_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_0_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_12_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_4_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_2_8_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_0_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_12_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_4_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_4_8_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_0_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_12_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_4_3.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_0.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_0.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_0.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_0.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_1.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_1.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_1.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_1.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_2.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_2.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_2.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_2.bi.expect diff --git a/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_3.monitor.expect b/tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_3.bi.expect similarity index 100% rename from tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_3.monitor.expect rename to tests/antmicro/sram_incrementing/expects/test_sram_incrementing_8_8_3.bi.expect diff --git a/tests/brave_new_world_francis/expects/bit_truncation_fft.monitor.expect b/tests/brave_new_world_francis/expects/bit_truncation_fft.bi.expect similarity index 100% rename from tests/brave_new_world_francis/expects/bit_truncation_fft.monitor.expect rename to tests/brave_new_world_francis/expects/bit_truncation_fft.bi.expect diff --git a/tests/brave_new_world_francis/expects/bit_truncation_sha.monitor.expect b/tests/brave_new_world_francis/expects/bit_truncation_sha.bi.expect similarity index 100% rename from tests/brave_new_world_francis/expects/bit_truncation_sha.monitor.expect rename to tests/brave_new_world_francis/expects/bit_truncation_sha.bi.expect diff --git a/tests/brave_new_world_francis/expects/ftu_sha.monitor.expect b/tests/brave_new_world_francis/expects/ftu_sha.bi.expect similarity index 100% rename from tests/brave_new_world_francis/expects/ftu_sha.monitor.expect rename to tests/brave_new_world_francis/expects/ftu_sha.bi.expect diff --git a/tests/brave_new_world_francis/expects/signal_async.monitor.expect b/tests/brave_new_world_francis/expects/signal_async.bi.expect similarity index 100% rename from tests/brave_new_world_francis/expects/signal_async.monitor.expect rename to tests/brave_new_world_francis/expects/signal_async.bi.expect diff --git a/tests/brave_new_world_francis/expects/use_without_valid.monitor.expect b/tests/brave_new_world_francis/expects/use_without_valid.bi.expect similarity index 100% rename from tests/brave_new_world_francis/expects/use_without_valid.monitor.expect rename to tests/brave_new_world_francis/expects/use_without_valid.bi.expect diff --git a/tests/ethmac/expects/ethmac_wishbone_manager.bi.expect b/tests/ethmac/expects/ethmac_wishbone_manager.bi.expect new file mode 100644 index 00000000..102c1bf9 --- /dev/null +++ b/tests/ethmac/expects/ethmac_wishbone_manager.bi.expect @@ -0,0 +1,8 @@ +error: the following required arguments were not provided: + --wave + +Usage: bi --wave --show-waveform-time --color --protocol --instances ... --sample-posedge --time-unit + +For more information, try '--help'. +---CODE--- +2 diff --git a/tests/ethmac/expects/ethmac_wishbone_manager.monitor.expect b/tests/ethmac/expects/ethmac_wishbone_manager.monitor.expect deleted file mode 100644 index 57404ebb..00000000 --- a/tests/ethmac/expects/ethmac_wishbone_manager.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -2 diff --git a/tests/ethmac/expects/ethmac_wishbone_subordinate.bi.expect b/tests/ethmac/expects/ethmac_wishbone_subordinate.bi.expect new file mode 100644 index 00000000..102c1bf9 --- /dev/null +++ b/tests/ethmac/expects/ethmac_wishbone_subordinate.bi.expect @@ -0,0 +1,8 @@ +error: the following required arguments were not provided: + --wave + +Usage: bi --wave --show-waveform-time --color --protocol --instances ... --sample-posedge --time-unit + +For more information, try '--help'. +---CODE--- +2 diff --git a/tests/ethmac/expects/ethmac_wishbone_subordinate.monitor.expect b/tests/ethmac/expects/ethmac_wishbone_subordinate.monitor.expect deleted file mode 100644 index 57404ebb..00000000 --- a/tests/ethmac/expects/ethmac_wishbone_subordinate.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -2 diff --git a/tests/fifo/expects/fifo.monitor.expect b/tests/fifo/expects/fifo.bi.expect similarity index 81% rename from tests/fifo/expects/fifo.monitor.expect rename to tests/fifo/expects/fifo.bi.expect index 8d3f2a95..9ecea916 100644 --- a/tests/fifo/expects/fifo.monitor.expect +++ b/tests/fifo/expects/fifo.bi.expect @@ -6,4 +6,5 @@ trace { idle(); pop(3); pop(4); + push(1995394993); } diff --git a/tests/fifo/expects/push_pop_identity.monitor.expect b/tests/fifo/expects/push_pop_identity.bi.expect similarity index 100% rename from tests/fifo/expects/push_pop_identity.monitor.expect rename to tests/fifo/expects/push_pop_identity.bi.expect diff --git a/tests/fifo/expects/push_pop_loop_empty.interp.expect b/tests/fifo/expects/push_pop_loop_empty.interp.expect deleted file mode 100644 index f5f6cb49..00000000 --- a/tests/fifo/expects/push_pop_loop_empty.interp.expect +++ /dev/null @@ -1 +0,0 @@ -Trace 0 executed successfully! diff --git a/tests/fifo/expects/push_pop_loop_empty.monitor.expect b/tests/fifo/expects/push_pop_loop_empty.monitor.expect deleted file mode 100644 index 5b85e011..00000000 --- a/tests/fifo/expects/push_pop_loop_empty.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -124 diff --git a/tests/fifo/expects/push_pop_loop_not_empty.interp.expect b/tests/fifo/expects/push_pop_loop_not_empty.interp.expect deleted file mode 100644 index f5f6cb49..00000000 --- a/tests/fifo/expects/push_pop_loop_not_empty.interp.expect +++ /dev/null @@ -1 +0,0 @@ -Trace 0 executed successfully! diff --git a/tests/fifo/expects/push_pop_loop_not_empty.monitor.expect b/tests/fifo/expects/push_pop_loop_not_empty.monitor.expect deleted file mode 100644 index 5b85e011..00000000 --- a/tests/fifo/expects/push_pop_loop_not_empty.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -124 diff --git a/tests/fifo/fifo.monitor.prot b/tests/fifo/fifo.bi.prot similarity index 100% rename from tests/fifo/fifo.monitor.prot rename to tests/fifo/fifo.bi.prot diff --git a/tests/fifo/fifo_bounded_loop.prot b/tests/fifo/fifo_bounded_loop.prot deleted file mode 100644 index 009c5f14..00000000 --- a/tests/fifo/fifo_bounded_loop.prot +++ /dev/null @@ -1,69 +0,0 @@ -// FIFO protocols using bounded loops to push/pop multiple elements - -struct Fifo { - in data_i: u32, - in v_i: u1, - in enq_not_deq_i: u1, - in reset_i: u1, // Active-high (i.e. reset = 1 means we actually reset) - out full_o: u1, - out empty_o: u1, - out data_o: u32 -} - -// Push the same value `num_iters` times -prot push_n_times(input: u32, num_iters: uint) { - repeat num_iters iterations { - // We just inlined the `push` protocol in `fifo.prot` here - DUT.reset_i := 1'b0; - DUT.enq_not_deq_i := 1'b1; - DUT.v_i := 1'b1; - DUT.data_i := input; - step(); - } - DUT.enq_not_deq_i := X; - DUT.v_i := X; - DUT.data_i := X; - DUT.reset_i := X; - fork(); - step(); -} - -// Pop `num_iters` times, each time asserting that the popped value matches `expected` -prot pop_n_times(expected: u32, num_iters: uint) { - repeat num_iters iterations { - // We just inlined the `pop` protocol in `fifo.prot` here - DUT.reset_i := 1'b0; - DUT.enq_not_deq_i := 1'b0; - DUT.v_i := 1'b1; - step(); - DUT.enq_not_deq_i := X; - DUT.v_i := X; - DUT.reset_i := X; - DUT.data_i := X; - assert_eq(DUT.data_o, expected); - } - fork(); - step(); -} - -// Assert that the FIFO is empty -prot check_empty() { - DUT.v_i := 1'b0; - DUT.reset_i := 1'b0; - assert_eq(DUT.empty_o, 1'b1); - step(); -} - -// Assert that the FIFO is not empty -prot check_not_empty() { - DUT.v_i := 1'b0; - DUT.reset_i := 1'b0; - assert_eq(DUT.empty_o, 1'b0); - step(); -} - -prot reset() { - DUT.reset_i := 1'b1; - DUT.v_i := 1'b0; - step(); -} diff --git a/tests/fifo/push_pop_loop_empty.fst b/tests/fifo/push_pop_loop_empty.fst deleted file mode 100644 index 088fab2f..00000000 Binary files a/tests/fifo/push_pop_loop_empty.fst and /dev/null differ diff --git a/tests/fifo/push_pop_loop_empty.prof b/tests/fifo/push_pop_loop_empty.prof deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/fifo/push_pop_loop_empty.prot b/tests/fifo/push_pop_loop_empty.prot deleted file mode 100644 index 009c5f14..00000000 --- a/tests/fifo/push_pop_loop_empty.prot +++ /dev/null @@ -1,69 +0,0 @@ -// FIFO protocols using bounded loops to push/pop multiple elements - -struct Fifo { - in data_i: u32, - in v_i: u1, - in enq_not_deq_i: u1, - in reset_i: u1, // Active-high (i.e. reset = 1 means we actually reset) - out full_o: u1, - out empty_o: u1, - out data_o: u32 -} - -// Push the same value `num_iters` times -prot push_n_times(input: u32, num_iters: uint) { - repeat num_iters iterations { - // We just inlined the `push` protocol in `fifo.prot` here - DUT.reset_i := 1'b0; - DUT.enq_not_deq_i := 1'b1; - DUT.v_i := 1'b1; - DUT.data_i := input; - step(); - } - DUT.enq_not_deq_i := X; - DUT.v_i := X; - DUT.data_i := X; - DUT.reset_i := X; - fork(); - step(); -} - -// Pop `num_iters` times, each time asserting that the popped value matches `expected` -prot pop_n_times(expected: u32, num_iters: uint) { - repeat num_iters iterations { - // We just inlined the `pop` protocol in `fifo.prot` here - DUT.reset_i := 1'b0; - DUT.enq_not_deq_i := 1'b0; - DUT.v_i := 1'b1; - step(); - DUT.enq_not_deq_i := X; - DUT.v_i := X; - DUT.reset_i := X; - DUT.data_i := X; - assert_eq(DUT.data_o, expected); - } - fork(); - step(); -} - -// Assert that the FIFO is empty -prot check_empty() { - DUT.v_i := 1'b0; - DUT.reset_i := 1'b0; - assert_eq(DUT.empty_o, 1'b1); - step(); -} - -// Assert that the FIFO is not empty -prot check_not_empty() { - DUT.v_i := 1'b0; - DUT.reset_i := 1'b0; - assert_eq(DUT.empty_o, 1'b0); - step(); -} - -prot reset() { - DUT.reset_i := 1'b1; - DUT.v_i := 1'b0; - step(); -} diff --git a/tests/fifo/push_pop_loop_empty.tx b/tests/fifo/push_pop_loop_empty.tx deleted file mode 100644 index 7268ba3b..00000000 --- a/tests/fifo/push_pop_loop_empty.tx +++ /dev/null @@ -1,6 +0,0 @@ -trace { - reset(); - push_n_times(42, 4); // Push 42 four times - pop_n_times(42, 4); // Pop four times - check_empty(); // FIFO should be empty after pushing and popping the same no. of times -} diff --git a/tests/fifo/push_pop_loop_not_empty.fst b/tests/fifo/push_pop_loop_not_empty.fst deleted file mode 100644 index c6250321..00000000 Binary files a/tests/fifo/push_pop_loop_not_empty.fst and /dev/null differ diff --git a/tests/fifo/push_pop_loop_not_empty.prof b/tests/fifo/push_pop_loop_not_empty.prof deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/fifo/push_pop_loop_not_empty.prot b/tests/fifo/push_pop_loop_not_empty.prot deleted file mode 100644 index 009c5f14..00000000 --- a/tests/fifo/push_pop_loop_not_empty.prot +++ /dev/null @@ -1,69 +0,0 @@ -// FIFO protocols using bounded loops to push/pop multiple elements - -struct Fifo { - in data_i: u32, - in v_i: u1, - in enq_not_deq_i: u1, - in reset_i: u1, // Active-high (i.e. reset = 1 means we actually reset) - out full_o: u1, - out empty_o: u1, - out data_o: u32 -} - -// Push the same value `num_iters` times -prot push_n_times(input: u32, num_iters: uint) { - repeat num_iters iterations { - // We just inlined the `push` protocol in `fifo.prot` here - DUT.reset_i := 1'b0; - DUT.enq_not_deq_i := 1'b1; - DUT.v_i := 1'b1; - DUT.data_i := input; - step(); - } - DUT.enq_not_deq_i := X; - DUT.v_i := X; - DUT.data_i := X; - DUT.reset_i := X; - fork(); - step(); -} - -// Pop `num_iters` times, each time asserting that the popped value matches `expected` -prot pop_n_times(expected: u32, num_iters: uint) { - repeat num_iters iterations { - // We just inlined the `pop` protocol in `fifo.prot` here - DUT.reset_i := 1'b0; - DUT.enq_not_deq_i := 1'b0; - DUT.v_i := 1'b1; - step(); - DUT.enq_not_deq_i := X; - DUT.v_i := X; - DUT.reset_i := X; - DUT.data_i := X; - assert_eq(DUT.data_o, expected); - } - fork(); - step(); -} - -// Assert that the FIFO is empty -prot check_empty() { - DUT.v_i := 1'b0; - DUT.reset_i := 1'b0; - assert_eq(DUT.empty_o, 1'b1); - step(); -} - -// Assert that the FIFO is not empty -prot check_not_empty() { - DUT.v_i := 1'b0; - DUT.reset_i := 1'b0; - assert_eq(DUT.empty_o, 1'b0); - step(); -} - -prot reset() { - DUT.reset_i := 1'b1; - DUT.v_i := 1'b0; - step(); -} diff --git a/tests/fifo/push_pop_loop_not_empty.tx b/tests/fifo/push_pop_loop_not_empty.tx deleted file mode 100644 index eb95530c..00000000 --- a/tests/fifo/push_pop_loop_not_empty.tx +++ /dev/null @@ -1,6 +0,0 @@ -trace { - reset(); - push_n_times(7, 3); - pop_n_times(7, 2); - check_not_empty(); // FIFO is non-empty (has one element remaining) -} diff --git a/tests/fpga-debugging/axi-burst-s4/expects/s4_buggy.bi.expect b/tests/fpga-debugging/axi-burst-s4/expects/s4_buggy.bi.expect new file mode 100644 index 00000000..67a3c6de --- /dev/null +++ b/tests/fpga-debugging/axi-burst-s4/expects/s4_buggy.bi.expect @@ -0,0 +1,11 @@ +// trace 0 +trace { +} +error: [write_burst@95] executing step 67 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-burst-s4/s4_buggy.prot:63:5 + │ +63 │ DUT.m_wlast := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^ [write_burst@95] executing step 67 of the transaction: 0 != 1 + +---CODE--- +1 diff --git a/tests/fpga-debugging/axi-burst-s4/expects/s4_buggy.monitor.expect b/tests/fpga-debugging/axi-burst-s4/expects/s4_buggy.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/fpga-debugging/axi-burst-s4/expects/s4_buggy.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/fpga-debugging/axi-burst-s4/expects/s4_fixed.monitor.expect b/tests/fpga-debugging/axi-burst-s4/expects/s4_fixed.bi.expect similarity index 100% rename from tests/fpga-debugging/axi-burst-s4/expects/s4_fixed.monitor.expect rename to tests/fpga-debugging/axi-burst-s4/expects/s4_fixed.bi.expect diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy.bi.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy.bi.expect new file mode 100644 index 00000000..3b9d8bbd --- /dev/null +++ b/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy.bi.expect @@ -0,0 +1,28 @@ +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] + write(64, 2147483648, 0, 0); // [time: 25ns -> 100ns] +} +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] +} +error: [read_v2@11?1!] executing step 3 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy.prot:169:5 + │ +169 │ assert_eq(DUT.S_AXI_ARREADY, 1'b0); + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v2@11?1!] executing step 3 of the transaction: 1 != 0 + + +// trace 1 +trace { + idle(); // [time: 0ns -> 25ns] +} +error: [read_v2@11?2?] executing step 3 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy.prot:163:9 + │ +163 │ DUT.S_AXI_RREADY := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v2@11?2?] executing step 3 of the transaction: 1 != 0 + +---CODE--- +1 diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy.monitor.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy_workload_1.bi.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy_workload_1.bi.expect new file mode 100644 index 00000000..f3ec1c05 --- /dev/null +++ b/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy_workload_1.bi.expect @@ -0,0 +1,85 @@ +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] + write_stalled(64, 2147483648, 0); // [time: 25ns -> 75ns] + write_stalled(64, 2147483648, 0); // [time: 75ns -> 100ns] +} + +// trace 1 +trace { + write_stalled(64, 2147483648, 1); // [time: 0ns -> 75ns] + write_stalled(64, 2147483648, 0); // [time: 75ns -> 100ns] +} +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] + read_v1(64, 0); // [time: 25ns -> 100ns] +} +error: [read_v2@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot:161:5 + │ +161 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v2@4] executing step 0 of the transaction: 0 != 1 + + +// trace 1 +trace { + idle(); // [time: 0ns -> 25ns] + read_v1(64, 0); // [time: 25ns -> 100ns] +} +error: [read_v1@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot:124:5 + │ +124 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v1@4] executing step 0 of the transaction: 0 != 1 + + +// trace 2 +trace { + idle(); // [time: 0ns -> 25ns] + read_v1(64, 0); // [time: 25ns -> 100ns] +} +error: [idle@4] executing step 0 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot:108:5 + │ +108 │ DUT.S_AXI_RREADY := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [idle@4] executing step 0 of the transaction: 1 != 0 + + +// trace 3 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(64, 0, 0); // [time: 25ns -> 100ns] +} +error: [read_v2@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot:161:5 + │ +161 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v2@4] executing step 0 of the transaction: 0 != 1 + + +// trace 4 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(64, 0, 0); // [time: 25ns -> 100ns] +} +error: [read_v1@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot:124:5 + │ +124 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v1@4] executing step 0 of the transaction: 0 != 1 + + +// trace 5 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(64, 0, 0); // [time: 25ns -> 100ns] +} +error: [idle@4] executing step 0 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_buggy_workload_1.prot:108:5 + │ +108 │ DUT.S_AXI_RREADY := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [idle@4] executing step 0 of the transaction: 1 != 0 + +---CODE--- +1 diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy_workload_1.monitor.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy_workload_1.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/fpga-debugging/axi-lite-s1/expects/s1_buggy_workload_1.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed.bi.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed.bi.expect new file mode 100644 index 00000000..ecf4be3e --- /dev/null +++ b/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed.bi.expect @@ -0,0 +1,12 @@ +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] + write(64, 2147483648, 0, 0); // [time: 25ns -> 100ns] +} +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(68, 0, 1); // [time: 25ns -> 125ns] + idle(); // [time: 125ns -> 150ns] + idle(); // [time: 150ns -> 150ns] +} diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed.monitor.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed.monitor.expect deleted file mode 100644 index aabbc981..00000000 --- a/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed.monitor.expect +++ /dev/null @@ -1,8 +0,0 @@ -// trace 0 -trace { - WriteSubordinate::idle(); // [time: 0ns -> 25ns] - ReadSubordinate::idle(); // [time: 0ns -> 25ns] - WriteSubordinate::write(64, 2147483648, 0, 0); // [time: 25ns -> 100ns] - ReadSubordinate::read_v2(68, 0, 1); // [time: 50ns -> 125ns] - ReadSubordinate::idle(); // [time: 125ns -> 150ns] -} diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed_workload_1.bi.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed_workload_1.bi.expect new file mode 100644 index 00000000..5b0357ce --- /dev/null +++ b/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed_workload_1.bi.expect @@ -0,0 +1,77 @@ +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] +} +// trace 0 +trace { + idle(); // [time: 0ns -> 25ns] + read_v1(64, 0); // [time: 25ns -> 100ns] +} +error: [read_v2@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot:161:5 + │ +161 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v2@4] executing step 0 of the transaction: 0 != 1 + + +// trace 1 +trace { + idle(); // [time: 0ns -> 25ns] + read_v1(64, 0); // [time: 25ns -> 100ns] +} +error: [read_v1@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot:124:5 + │ +124 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v1@4] executing step 0 of the transaction: 0 != 1 + + +// trace 2 +trace { + idle(); // [time: 0ns -> 25ns] + read_v1(64, 0); // [time: 25ns -> 100ns] +} +error: [idle@4] executing step 0 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot:108:5 + │ +108 │ DUT.S_AXI_RREADY := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [idle@4] executing step 0 of the transaction: 1 != 0 + + +// trace 3 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(64, 0, 0); // [time: 25ns -> 100ns] +} +error: [read_v2@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot:161:5 + │ +161 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v2@4] executing step 0 of the transaction: 0 != 1 + + +// trace 4 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(64, 0, 0); // [time: 25ns -> 100ns] +} +error: [read_v1@4] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot:124:5 + │ +124 │ DUT.S_AXI_ARVALID := 1'b1; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [read_v1@4] executing step 0 of the transaction: 0 != 1 + + +// trace 5 +trace { + idle(); // [time: 0ns -> 25ns] + read_v2(64, 0, 0); // [time: 25ns -> 100ns] +} +error: [idle@4] executing step 0 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axi-lite-s1/s1_fixed_workload_1.prot:108:5 + │ +108 │ DUT.S_AXI_RREADY := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [idle@4] executing step 0 of the transaction: 1 != 0 + +---CODE--- +1 diff --git a/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed_workload_1.monitor.expect b/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed_workload_1.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/fpga-debugging/axi-lite-s1/expects/s1_fixed_workload_1.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/fpga-debugging/axi-lite-s1/s1_alt.prot b/tests/fpga-debugging/axi-lite-s1/s1_alt.prot new file mode 100644 index 00000000..2c0b19d5 --- /dev/null +++ b/tests/fpga-debugging/axi-lite-s1/s1_alt.prot @@ -0,0 +1,189 @@ + +struct Subordinate { + // Active-low reset + in S_AXI_ARESETN: u1, + + // Write address channel + in S_AXI_AWVALID: u1, + in S_AXI_AWADDR: u7, + out S_AXI_AWREADY: u1, + + // Write data channel + in S_AXI_WVALID: u1, + in S_AXI_WDATA: u32, + out S_AXI_WREADY: u1, + + // Write response channel + in S_AXI_BREADY: u1, + out S_AXI_BVALID: u1, + out S_AXI_BRESP: u2, + + // Read address channel + in S_AXI_ARVALID: u1, + in S_AXI_ARADDR: u7, + out S_AXI_ARREADY: u1, + + // Read data channel + in S_AXI_RREADY: u1, + out S_AXI_RVALID: u1, + out S_AXI_RDATA: u32, +} + +prot reset() { + // Reset is active-low + DUT.S_AXI_ARESETN := 1'b0; + + // Set valid = 0 for the write data / write address / read address channels + DUT.S_AXI_AWVALID := 1'b0; + DUT.S_AXI_WVALID := 1'b0; + DUT.S_AXI_ARVALID := 1'b0; + + // Set ready = 0 for the write response / read data channels + DUT.S_AXI_BREADY := 1'b0; + DUT.S_AXI_RREADY := 1'b0; + + step(); +} + + +#[idle] +prot idle() { + // Reset is active-low, so we set reset = 1 here + // to indicate that the DUT is *not* reset during an `idle` transaction + DUT.S_AXI_ARESETN := 1'b1; + + // No requests on either address channel + DUT.S_AXI_AWVALID := 1'b0; + DUT.S_AXI_AWADDR := X; + DUT.S_AXI_WVALID := 1'b0; + DUT.S_AXI_WDATA := X; + DUT.S_AXI_ARVALID := 1'b0; + DUT.S_AXI_ARADDR := X; + + // No transfer on the read data channel. + // (Note: BREADY is deliberately left unconstrained: the workload + // testbenches keep BREADY high after their last write completes.) + DUT.S_AXI_RREADY := 1'b0; + + step(); +} + +// // Note: this is still WIP (this is simpler than the protocol we discussed +// // yesterday for ease of debugging for now) +// prot write(addr: u7, data: u32, resp: u2, n: uint) { +// repeat n iterations { +// DUT.S_AXI_AWVALID := 1'b0; +// step(); +// } +// DUT.S_AXI_AWVALID := 1'b1; +// DUT.S_AXI_AWADDR := addr; + +// DUT.S_AXI_WVALID := 1'b1; +// DUT.S_AXI_WDATA := data; + +// // technically this should be `while !AWREADY && !WREADY { step() }` +// // but our DSL doesn't have `&&`. Without loss of generality, +// // we wait for AWREADY to become 1 +// while !(DUT.S_AXI_AWREADY == 1'b1) { +// step(); +// } +// // Assuming AWREADY & WREADY become 1 together +// // (this is allowed in the AXI spec and the DUT exhibits this behavior) +// assert_eq(DUT.S_AXI_WREADY, 1'b1); + +// step(); + +// // Remove constraints on AWVALID and WVALID +// DUT.S_AXI_AWVALID := X; +// DUT.S_AXI_WVALID := X; + +// // Wait for BVALID to become 1 +// while !(DUT.S_AXI_BVALID == 1'b1) { +// step(); +// } +// // BVALID is now 1 +// // Wait for some no. of cycles before BREADY becomes 1 +// repeat n iterations { +// step(); +// // BVALID must remain stable after it becomes 1 +// assert_eq(DUT.S_AXI_BVALID, 1'b1); +// } +// DUT.S_AXI_BREADY := 1'b1; +// assert_eq(DUT.S_AXI_BRESP, resp); +// step(); +// } + +// RREADY is asserted before RVALID +// (This is allowed in section A2.3.2.2 of the AXI spec) +prot read_v1(addr: u7, data: u32) { + DUT.S_AXI_ARVALID := 1'b1; + DUT.S_AXI_ARADDR := addr; + + // Wait for ARREADY to become 1 + while !(DUT.S_AXI_ARREADY == 1'b1) { + step(); + } + // ARREADY is now 1 + + step(); + + assert_eq(DUT.S_AXI_ARREADY, 1'b0); + DUT.S_AXI_RREADY := 1'b1; + + // Wait for RVALID to become 1 + // AXI spec says that ARVALID & ARREADY must both be 1 + // before RVALID can be asserted (A2.3.2.2) + while !(DUT.S_AXI_RVALID == 1'b1) { + step(); + assert_eq(DUT.S_AXI_ARREADY, 1'b0); + } + assert_eq(DUT.S_AXI_RDATA, data); + step(); +} + +// RVALID is asserted before RREADY +// (This is allowed in section A2.3.2.2 of the AXI spec) +prot read_v2(addr: u7, data: u32, n: uint) { + DUT.S_AXI_ARVALID := 1'b1; + DUT.S_AXI_ARADDR := addr; + + // Wait for ARREADY to become 1 + while !(DUT.S_AXI_ARREADY == 1'b1) { + step(); + } + // ARREADY is now 1 + + step(); + + fork(); + + // Wait for RVALID to become 1 + // AXI spec says that ARVALID & ARREADY must both be 1 + // before RVALID can be asserted (A2.3.2.2) + while !(DUT.S_AXI_RVALID == 1'b1) { + step(); + } + // RVALID is now 1 + + // While we are waiting for RREADY to become 1, + // another read address request cannot arrive + // (i.e. ARREADY has to remain 0). That is, we have to acknowledge + // the read data before another read address request can arrive. + assert_eq(DUT.S_AXI_ARREADY, 1'b0); + + // Wait until RREADY becomes 1 + repeat n iterations { + DUT.S_AXI_RREADY := 1'b0; + // Check that RVALID remains stable + assert_eq(DUT.S_AXI_RVALID, 1'b1); + step(); + } + // Check that ARREADY remains 0 (i.e. no conflicting read address request) + assert_eq(DUT.S_AXI_ARREADY, 1'b0); + + // Perform data transfer on the read data channel + DUT.S_AXI_RREADY := 1'b1; + assert_eq(DUT.S_AXI_RDATA, data); + + step(); +} \ No newline at end of file diff --git a/tests/fpga-debugging/axi-stream-s2/expects/s2_buggy.monitor.expect b/tests/fpga-debugging/axi-stream-s2/expects/s2_buggy.bi.expect similarity index 93% rename from tests/fpga-debugging/axi-stream-s2/expects/s2_buggy.monitor.expect rename to tests/fpga-debugging/axi-stream-s2/expects/s2_buggy.bi.expect index 343c9ed9..a37a8103 100644 --- a/tests/fpga-debugging/axi-stream-s2/expects/s2_buggy.monitor.expect +++ b/tests/fpga-debugging/axi-stream-s2/expects/s2_buggy.bi.expect @@ -14,5 +14,4 @@ trace { recv(4); // [time: 937.5ns -> 962.5ns] recv(5); // [time: 962.5ns -> 987.5ns] recv(6); // [time: 987.5ns -> 1012.5ns] - stall(7, 0); // [time: 1012.5ns -> 1050ns] } diff --git a/tests/fpga-debugging/axi-stream-s2/expects/s2_fixed.monitor.expect b/tests/fpga-debugging/axi-stream-s2/expects/s2_fixed.bi.expect similarity index 94% rename from tests/fpga-debugging/axi-stream-s2/expects/s2_fixed.monitor.expect rename to tests/fpga-debugging/axi-stream-s2/expects/s2_fixed.bi.expect index 190a394f..9e4f85a7 100644 --- a/tests/fpga-debugging/axi-stream-s2/expects/s2_fixed.monitor.expect +++ b/tests/fpga-debugging/axi-stream-s2/expects/s2_fixed.bi.expect @@ -16,7 +16,7 @@ trace { recv(6); // [time: 987.5ns -> 1012.5ns] stall(7, 0); // [time: 1012.5ns -> 1062.5ns] reset(); // [time: 1062.5ns -> 1087.5ns] - reset(); // [time: 1087.5ns -> 1100ns] + reset(); // [time: 1087.5ns -> 1087.5ns] } // trace 1 @@ -36,5 +36,5 @@ trace { recv(5); // [time: 962.5ns -> 987.5ns] recv(6); // [time: 987.5ns -> 1012.5ns] reset(); // [time: 1062.5ns -> 1087.5ns] - reset(); // [time: 1087.5ns -> 1100ns] + reset(); // [time: 1087.5ns -> 1087.5ns] } diff --git a/tests/fpga-debugging/axis-adapter-s3/expects/s3_buggy.monitor.expect b/tests/fpga-debugging/axis-adapter-s3/expects/s3_buggy.bi.expect similarity index 89% rename from tests/fpga-debugging/axis-adapter-s3/expects/s3_buggy.monitor.expect rename to tests/fpga-debugging/axis-adapter-s3/expects/s3_buggy.bi.expect index fc233887..204d6b80 100644 --- a/tests/fpga-debugging/axis-adapter-s3/expects/s3_buggy.monitor.expect +++ b/tests/fpga-debugging/axis-adapter-s3/expects/s3_buggy.bi.expect @@ -9,5 +9,5 @@ trace { recv(205); // [time: 150ns -> 175ns] recv(171); // [time: 175ns -> 200ns] recv(205); // [time: 200ns -> 225ns] - recv_last(171); // [time: 225ns -> 237.5ns] + recv_last(171); // [time: 225ns -> 225ns] } diff --git a/tests/fpga-debugging/axis-adapter-s3/expects/s3_fixed.monitor.expect b/tests/fpga-debugging/axis-adapter-s3/expects/s3_fixed.bi.expect similarity index 88% rename from tests/fpga-debugging/axis-adapter-s3/expects/s3_fixed.monitor.expect rename to tests/fpga-debugging/axis-adapter-s3/expects/s3_fixed.bi.expect index 989b7303..5cbf6070 100644 --- a/tests/fpga-debugging/axis-adapter-s3/expects/s3_fixed.monitor.expect +++ b/tests/fpga-debugging/axis-adapter-s3/expects/s3_fixed.bi.expect @@ -8,5 +8,5 @@ trace { recv(171); // [time: 125ns -> 150ns] recv(205); // [time: 150ns -> 175ns] recv(171); // [time: 175ns -> 200ns] - recv_last(205); // [time: 200ns -> 212.5ns] + recv_last(205); // [time: 200ns -> 200ns] } diff --git a/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_buggy.bi.expect b/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_buggy.bi.expect new file mode 100644 index 00000000..801003cc --- /dev/null +++ b/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_buggy.bi.expect @@ -0,0 +1,46 @@ +// trace 0 +trace { + reset(); // [time: 0ns -> 25ns] + idle(); // [time: 25ns -> 50ns] + push(1); // [time: 50ns -> 75ns] + push(2); // [time: 75ns -> 100ns] + push(3); // [time: 100ns -> 125ns] + push(4); // [time: 125ns -> 150ns] + push(5); // [time: 150ns -> 175ns] + push(6); // [time: 175ns -> 200ns] + push(7); // [time: 200ns -> 200ns] +} +// trace 0 +trace { + reset(); // [time: 0ns -> 25ns] +} +error: [reset@1] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot:115:5 + │ +115 │ DUT.rst := 1'b1; + │ ^^^^^^^^^^^^^^^^ [reset@1] executing step 0 of the transaction: 0 != 1 + + +// trace 1 +trace { + reset(); // [time: 0ns -> 25ns] +} +error: [idle@1] executing step 0 of the transaction: 1 != 0 + ┌─ tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot:97:5 + │ +97 │ DUT.m_axis_tready := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^ [idle@1] executing step 0 of the transaction: 1 != 0 + + +// trace 2 +trace { + reset(); // [time: 0ns -> 25ns] +} +error: [pop@1] executing step 0 of the transaction: 0 != 1 + ┌─ tests/fpga-debugging/axis-async-fifo-c4/c4_buggy.prot:62:5 + │ +62 │ assert_eq(DUT.m_axis_tvalid, 1'b1); + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [pop@1] executing step 0 of the transaction: 0 != 1 + +---CODE--- +1 diff --git a/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_buggy.monitor.expect b/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_buggy.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_buggy.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_fixed.bi.expect b/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_fixed.bi.expect new file mode 100644 index 00000000..49910681 --- /dev/null +++ b/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_fixed.bi.expect @@ -0,0 +1,26 @@ +// trace 0 +trace { + reset(); // [time: 0ns -> 25ns] + idle(); // [time: 25ns -> 50ns] + push(1); // [time: 50ns -> 75ns] + push(2); // [time: 75ns -> 100ns] + push(3); // [time: 100ns -> 150ns] + push(4); // [time: 150ns -> 175ns] + push(5); // [time: 175ns -> 200ns] + push(6); // [time: 200ns -> 225ns] + push(7); // [time: 225ns -> 250ns] + push(8); // [time: 250ns -> 250ns] +} +// trace 0 +trace { + reset(); // [time: 0ns -> 25ns] + idle(); // [time: 25ns -> 50ns] + idle(); // [time: 50ns -> 75ns] + idle(); // [time: 75ns -> 100ns] + pop(2); // [time: 100ns -> 150ns] + pop(3); // [time: 125ns -> 175ns] + pop(4); // [time: 150ns -> 200ns] + pop(5); // [time: 175ns -> 225ns] + pop(6); // [time: 200ns -> 250ns] + pop(7); // [time: 225ns -> 250ns] +} diff --git a/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_fixed.monitor.expect b/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_fixed.monitor.expect deleted file mode 100644 index 421b780e..00000000 --- a/tests/fpga-debugging/axis-async-fifo-c4/expects/c4_fixed.monitor.expect +++ /dev/null @@ -1,23 +0,0 @@ -// trace 0 -trace { - Sender::reset(); // [time: 0ns -> 25ns] - Receiver::reset(); // [time: 0ns -> 25ns] - Sender::idle(); // [time: 25ns -> 50ns] - Receiver::idle(); // [time: 25ns -> 50ns] - Sender::push(1); // [time: 50ns -> 75ns] - Receiver::idle(); // [time: 50ns -> 75ns] - Sender::push(2); // [time: 75ns -> 100ns] - Receiver::idle(); // [time: 75ns -> 100ns] - Sender::push(3); // [time: 100ns -> 150ns] - Receiver::pop(2); // [time: 100ns -> 150ns] - Sender::push(4); // [time: 150ns -> 175ns] - Receiver::pop(3); // [time: 125ns -> 175ns] - Sender::push(5); // [time: 175ns -> 200ns] - Receiver::pop(4); // [time: 150ns -> 200ns] - Sender::push(6); // [time: 200ns -> 225ns] - Receiver::pop(5); // [time: 175ns -> 225ns] - Sender::push(7); // [time: 225ns -> 250ns] - Receiver::pop(6); // [time: 200ns -> 250ns] - Sender::push(8); // [time: 250ns -> 262.5ns] - Receiver::pop(7); // [time: 225ns -> 262.5ns] -} diff --git a/tests/fpga-debugging/axis-fifo-d11/expects/d11_buggy.monitor.expect b/tests/fpga-debugging/axis-fifo-d11/expects/d11_buggy.bi.expect similarity index 92% rename from tests/fpga-debugging/axis-fifo-d11/expects/d11_buggy.monitor.expect rename to tests/fpga-debugging/axis-fifo-d11/expects/d11_buggy.bi.expect index 7f01204e..c0878918 100644 --- a/tests/fpga-debugging/axis-fifo-d11/expects/d11_buggy.monitor.expect +++ b/tests/fpga-debugging/axis-fifo-d11/expects/d11_buggy.bi.expect @@ -13,5 +13,5 @@ trace { push(6); // [time: 250ns -> 275ns] push(6); // [time: 275ns -> 300ns] reset(); // [time: 300ns -> 325ns] - push(6); // [time: 325ns -> 337.5ns] + push(6); // [time: 325ns -> 325ns] } diff --git a/tests/fpga-debugging/axis-fifo-d11/expects/d11_fixed.monitor.expect b/tests/fpga-debugging/axis-fifo-d11/expects/d11_fixed.bi.expect similarity index 94% rename from tests/fpga-debugging/axis-fifo-d11/expects/d11_fixed.monitor.expect rename to tests/fpga-debugging/axis-fifo-d11/expects/d11_fixed.bi.expect index 91c4edb1..ccbf4bd8 100644 --- a/tests/fpga-debugging/axis-fifo-d11/expects/d11_fixed.monitor.expect +++ b/tests/fpga-debugging/axis-fifo-d11/expects/d11_fixed.bi.expect @@ -17,5 +17,5 @@ trace { push(6); // [time: 350ns -> 375ns] push(7); // [time: 375ns -> 400ns] push(7); // [time: 400ns -> 425ns] - push(7); // [time: 425ns -> 437.5ns] + push(7); // [time: 425ns -> 425ns] } diff --git a/tests/fpga-debugging/axis-fifo-d12/expects/d12_buggy.monitor.expect b/tests/fpga-debugging/axis-fifo-d12/expects/d12_buggy.bi.expect similarity index 90% rename from tests/fpga-debugging/axis-fifo-d12/expects/d12_buggy.monitor.expect rename to tests/fpga-debugging/axis-fifo-d12/expects/d12_buggy.bi.expect index 6a0936b1..008e0943 100644 --- a/tests/fpga-debugging/axis-fifo-d12/expects/d12_buggy.monitor.expect +++ b/tests/fpga-debugging/axis-fifo-d12/expects/d12_buggy.bi.expect @@ -12,5 +12,5 @@ trace { push_and_pop(6, 2); // [time: 225ns -> 275ns] push_and_pop(6, 3); // [time: 250ns -> 300ns] push_and_pop(7, 3); // [time: 275ns -> 325ns] - push_and_pop(7, 5); // [time: 300ns -> 362.5ns] + push_and_pop(7, 5); // [time: 300ns -> 350ns] } diff --git a/tests/fpga-debugging/axis-fifo-d12/expects/d12_fixed.monitor.expect b/tests/fpga-debugging/axis-fifo-d12/expects/d12_fixed.bi.expect similarity index 100% rename from tests/fpga-debugging/axis-fifo-d12/expects/d12_fixed.monitor.expect rename to tests/fpga-debugging/axis-fifo-d12/expects/d12_fixed.bi.expect diff --git a/tests/fpga-debugging/axis-fifo-d4/expects/d4_buggy.monitor.expect b/tests/fpga-debugging/axis-fifo-d4/expects/d4_buggy.bi.expect similarity index 97% rename from tests/fpga-debugging/axis-fifo-d4/expects/d4_buggy.monitor.expect rename to tests/fpga-debugging/axis-fifo-d4/expects/d4_buggy.bi.expect index 168cdc90..68cf837b 100644 --- a/tests/fpga-debugging/axis-fifo-d4/expects/d4_buggy.monitor.expect +++ b/tests/fpga-debugging/axis-fifo-d4/expects/d4_buggy.bi.expect @@ -43,5 +43,5 @@ trace { push(8); // [time: 137.5ns -> 140ns] push(9); // [time: 140ns -> 142.5ns] push(233); // [time: 142.5ns -> 145ns] - push(0); // [time: 157.5ns -> 158.75ns] + push(0); // [time: 157.5ns -> 157.5ns] } diff --git a/tests/fpga-debugging/axis-fifo-d4/expects/d4_fixed.bi.expect b/tests/fpga-debugging/axis-fifo-d4/expects/d4_fixed.bi.expect new file mode 100644 index 00000000..48aafb42 --- /dev/null +++ b/tests/fpga-debugging/axis-fifo-d4/expects/d4_fixed.bi.expect @@ -0,0 +1,54 @@ +// trace 0 +trace { + reset(); // [time: 0ns -> 2.5ns] + reset(); // [time: 2.5ns -> 5ns] + reset(); // [time: 5ns -> 7.5ns] + reset(); // [time: 7.5ns -> 10ns] + reset(); // [time: 10ns -> 12.5ns] + reset(); // [time: 12.5ns -> 15ns] + reset(); // [time: 15ns -> 17.5ns] + reset(); // [time: 17.5ns -> 20ns] + reset(); // [time: 20ns -> 22.5ns] + reset(); // [time: 22.5ns -> 25ns] + push(0); // [time: 37.5ns -> 40ns] + push(1); // [time: 40ns -> 42.5ns] + push(2); // [time: 42.5ns -> 45ns] + push(3); // [time: 45ns -> 47.5ns] + push(4); // [time: 47.5ns -> 50ns] + push(5); // [time: 50ns -> 52.5ns] + push(6); // [time: 52.5ns -> 55ns] + push(7); // [time: 55ns -> 57.5ns] + push(8); // [time: 57.5ns -> 60ns] + push(9); // [time: 60ns -> 62.5ns] + push(233); // [time: 62.5ns -> 65ns] + push(0); // [time: 77.5ns -> 80ns] + push(1); // [time: 80ns -> 82.5ns] + push(2); // [time: 82.5ns -> 85ns] + push(3); // [time: 85ns -> 87.5ns] + push(4); // [time: 87.5ns -> 90ns] + push(5); // [time: 90ns -> 92.5ns] + push(6); // [time: 92.5ns -> 95ns] + push(7); // [time: 95ns -> 97.5ns] + push(8); // [time: 97.5ns -> 100ns] + push(9); // [time: 100ns -> 102.5ns] + push(233); // [time: 102.5ns -> 105ns] + push(0); // [time: 117.5ns -> 120ns] + push(1); // [time: 120ns -> 122.5ns] + push(2); // [time: 122.5ns -> 125ns] + push(3); // [time: 125ns -> 127.5ns] + push(4); // [time: 127.5ns -> 130ns] + push(5); // [time: 130ns -> 132.5ns] + push(6); // [time: 132.5ns -> 135ns] + push(7); // [time: 135ns -> 137.5ns] + push(8); // [time: 137.5ns -> 140ns] + push(9); // [time: 140ns -> 142.5ns] + push(233); // [time: 142.5ns -> 145ns] +} +error: [push@63] executing step 1 of the transaction: 01 != 00 + ┌─ tests/fpga-debugging/axis-fifo-d4/d4_fixed.prot:89:5 + │ +89 │ DUT.s_axis_tdata := data; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^ [push@63] executing step 1 of the transaction: 01 != 00 + +---CODE--- +1 diff --git a/tests/fpga-debugging/axis-fifo-d4/expects/d4_fixed.monitor.expect b/tests/fpga-debugging/axis-fifo-d4/expects/d4_fixed.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/fpga-debugging/axis-fifo-d4/expects/d4_fixed.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/identities/expects/identity_d1.bi.expect b/tests/identities/expects/identity_d1.bi.expect new file mode 100644 index 00000000..86f06504 --- /dev/null +++ b/tests/identities/expects/identity_d1.bi.expect @@ -0,0 +1,4 @@ +// trace 0 +trace { + slicing_ok(1, X); +} diff --git a/tests/identities/expects/identity_d1.monitor.expect b/tests/identities/expects/identity_d1.monitor.expect deleted file mode 100644 index c47a0da0..00000000 --- a/tests/identities/expects/identity_d1.monitor.expect +++ /dev/null @@ -1,4 +0,0 @@ -// trace 0 -trace { - slicing_ok(1, 0); -} diff --git a/tests/multi/expects/multi0.monitor.expect b/tests/multi/expects/multi0.bi.expect similarity index 100% rename from tests/multi/expects/multi0.monitor.expect rename to tests/multi/expects/multi0.bi.expect diff --git a/tests/multi/expects/multi0keep.monitor.expect b/tests/multi/expects/multi0keep.bi.expect similarity index 100% rename from tests/multi/expects/multi0keep.monitor.expect rename to tests/multi/expects/multi0keep.bi.expect diff --git a/tests/multi/expects/multi0keep2const.monitor.expect b/tests/multi/expects/multi0keep2const.bi.expect similarity index 100% rename from tests/multi/expects/multi0keep2const.monitor.expect rename to tests/multi/expects/multi0keep2const.bi.expect diff --git a/tests/multi/expects/multi2const.monitor.expect b/tests/multi/expects/multi2const.bi.expect similarity index 100% rename from tests/multi/expects/multi2const.monitor.expect rename to tests/multi/expects/multi2const.bi.expect diff --git a/tests/multi/expects/multi2multi.monitor.expect b/tests/multi/expects/multi2multi.bi.expect similarity index 100% rename from tests/multi/expects/multi2multi.monitor.expect rename to tests/multi/expects/multi2multi.bi.expect diff --git a/tests/multi/expects/multi_data.monitor.expect b/tests/multi/expects/multi_data.bi.expect similarity index 100% rename from tests/multi/expects/multi_data.monitor.expect rename to tests/multi/expects/multi_data.bi.expect diff --git a/tests/multipliers/expects/mult_d2.monitor.expect b/tests/multipliers/expects/mult_d2.bi.expect similarity index 100% rename from tests/multipliers/expects/mult_d2.monitor.expect rename to tests/multipliers/expects/mult_d2.bi.expect diff --git a/tests/picorv32/expects/pcpi_mul_unsigned_mul.monitor.expect b/tests/picorv32/expects/pcpi_mul_unsigned_mul.bi.expect similarity index 100% rename from tests/picorv32/expects/pcpi_mul_unsigned_mul.monitor.expect rename to tests/picorv32/expects/pcpi_mul_unsigned_mul.bi.expect diff --git a/tests/serv/expects/serv_regfile.monitor.expect b/tests/serv/expects/serv_regfile.bi.expect similarity index 100% rename from tests/serv/expects/serv_regfile.monitor.expect rename to tests/serv/expects/serv_regfile.bi.expect diff --git a/tests/tinyaes128/expects/aes128.monitor.expect b/tests/tinyaes128/expects/aes128.bi.expect similarity index 100% rename from tests/tinyaes128/expects/aes128.monitor.expect rename to tests/tinyaes128/expects/aes128.bi.expect diff --git a/tests/wal/advanced/expects/axis.bi.expect b/tests/wal/advanced/expects/axis.bi.expect new file mode 100644 index 00000000..56066dee --- /dev/null +++ b/tests/wal/advanced/expects/axis.bi.expect @@ -0,0 +1,15 @@ +// trace 0 +trace { + send_data(0); // [time: 804ns -> 812ns] + send_data(1); // [time: 1508ns -> 1516ns] + send_data(2); // [time: 2212ns -> 2220ns] + send_data(3); // [time: 2916ns -> 2924ns] +} +error: [send_data@453] executing step 88 of the transaction: 05 != 04 + ┌─ tests/wal/advanced/axis.prot:10:5 + │ +10 │ D.m_axis_tdata := data; + │ ^^^^^^^^^^^^^^^^^^^^^^^ [send_data@453] executing step 88 of the transaction: 05 != 04 + +---CODE--- +1 diff --git a/tests/wal/advanced/expects/axis.monitor.expect b/tests/wal/advanced/expects/axis.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/wal/advanced/expects/axis.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/wal/advanced/expects/axis_failing.bi.expect b/tests/wal/advanced/expects/axis_failing.bi.expect new file mode 100644 index 00000000..ce009b0d --- /dev/null +++ b/tests/wal/advanced/expects/axis_failing.bi.expect @@ -0,0 +1,11 @@ +// trace 0 +trace { +} +error: [idle@0] executing step 0 of the transaction: 1 != 0 + ┌─ tests/wal/advanced/axis_failing.prot:11:5 + │ +11 │ D.m_axis_tvalid := 1'b0; + │ ^^^^^^^^^^^^^^^^^^^^^^^^ [idle@0] executing step 0 of the transaction: 1 != 0 + +---CODE--- +1 diff --git a/tests/wal/advanced/expects/axis_failing.monitor.expect b/tests/wal/advanced/expects/axis_failing.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/wal/advanced/expects/axis_failing.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/wal/advanced/expects/axis_minimal.bi.expect b/tests/wal/advanced/expects/axis_minimal.bi.expect new file mode 100644 index 00000000..5564118e --- /dev/null +++ b/tests/wal/advanced/expects/axis_minimal.bi.expect @@ -0,0 +1,11 @@ +// trace 0 +trace { +} +error: [send_data@0] executing step 3 of the transaction: 0f != 14 + ┌─ tests/wal/advanced/axis_minimal.prot:10:5 + │ +10 │ D.m_axis_tdata := data; + │ ^^^^^^^^^^^^^^^^^^^^^^^ [send_data@0] executing step 3 of the transaction: 0f != 14 + +---CODE--- +1 diff --git a/tests/wal/advanced/expects/axis_minimal.monitor.expect b/tests/wal/advanced/expects/axis_minimal.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/wal/advanced/expects/axis_minimal.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/wal/advanced/expects/axis_truncated.bi.expect b/tests/wal/advanced/expects/axis_truncated.bi.expect new file mode 100644 index 00000000..cef1509b --- /dev/null +++ b/tests/wal/advanced/expects/axis_truncated.bi.expect @@ -0,0 +1,11 @@ +// trace 0 +trace { +} +error: [send_data@0] executing step 88 of the transaction: 0f != 0e + ┌─ tests/wal/advanced/axis_truncated.prot:10:5 + │ +10 │ D.m_axis_tdata := data; + │ ^^^^^^^^^^^^^^^^^^^^^^^ [send_data@0] executing step 88 of the transaction: 0f != 0e + +---CODE--- +1 diff --git a/tests/wal/advanced/expects/axis_truncated.monitor.expect b/tests/wal/advanced/expects/axis_truncated.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/wal/advanced/expects/axis_truncated.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/wal/advanced/expects/axis_truncated_include_idle.bi.expect b/tests/wal/advanced/expects/axis_truncated_include_idle.bi.expect new file mode 100644 index 00000000..728b03c9 --- /dev/null +++ b/tests/wal/advanced/expects/axis_truncated_include_idle.bi.expect @@ -0,0 +1,11 @@ +// trace 0 +trace { +} +error: [send_data@0] executing step 88 of the transaction: 0f != 0e + ┌─ tests/wal/advanced/axis_truncated_include_idle.prot:11:5 + │ +11 │ D.m_axis_tdata := data; + │ ^^^^^^^^^^^^^^^^^^^^^^^ [send_data@0] executing step 88 of the transaction: 0f != 0e + +---CODE--- +1 diff --git a/tests/wal/advanced/expects/axis_truncated_include_idle.monitor.expect b/tests/wal/advanced/expects/axis_truncated_include_idle.monitor.expect deleted file mode 100644 index 6503598b..00000000 --- a/tests/wal/advanced/expects/axis_truncated_include_idle.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -1 diff --git a/tests/wb_intercon/expects/wb_arb.bi.expect b/tests/wb_intercon/expects/wb_arb.bi.expect new file mode 100644 index 00000000..102c1bf9 --- /dev/null +++ b/tests/wb_intercon/expects/wb_arb.bi.expect @@ -0,0 +1,8 @@ +error: the following required arguments were not provided: + --wave + +Usage: bi --wave --show-waveform-time --color --protocol --instances ... --sample-posedge --time-unit + +For more information, try '--help'. +---CODE--- +2 diff --git a/tests/wb_intercon/expects/wb_arb.monitor.expect b/tests/wb_intercon/expects/wb_arb.monitor.expect deleted file mode 100644 index 57404ebb..00000000 --- a/tests/wb_intercon/expects/wb_arb.monitor.expect +++ /dev/null @@ -1,2 +0,0 @@ ----CODE--- -2 diff --git a/tests/wb_intercon/expects/wb_cdc.bi.expect b/tests/wb_intercon/expects/wb_cdc.bi.expect new file mode 100644 index 00000000..a102bb76 --- /dev/null +++ b/tests/wb_intercon/expects/wb_cdc.bi.expect @@ -0,0 +1 @@ +Only nano seconds are supported (received time unit s). Exiting... diff --git a/tests/wb_intercon/expects/wb_cdc.monitor.expect b/tests/wb_intercon/expects/wb_cdc.monitor.expect deleted file mode 100644 index 672093d3..00000000 --- a/tests/wb_intercon/expects/wb_cdc.monitor.expect +++ /dev/null @@ -1,125 +0,0 @@ -// trace 0 -trace { - reset(); // [time: 157140570s -> 157140580s] - write(15, 40, 2297678865, 0); // [time: 157140580s -> 157140650s] - write(15, 44, 3604862125, 0); // [time: 157140650s -> 157140730s] - write(15, 48, 648269133, 0); // [time: 157140730s -> 157140800s] - write(15, 52, 223519002, 0); // [time: 157140800s -> 157140880s] - write(15, 56, 2069755382, 0); // [time: 157140880s -> 157140950s] - write(15, 60, 2191335941, 0); // [time: 157140950s -> 157141030s] - write(15, 64, 3011745895, 0); // [time: 157141030s -> 157141100s] - write(15, 68, 90880778, 0); // [time: 157141100s -> 157141180s] - write(15, 72, 2066225142, 0); // [time: 157141180s -> 157141250s] - write(15, 76, 3164103289, 0); // [time: 157141250s -> 157141330s] - write(15, 80, 594197318, 0); // [time: 157141330s -> 157141400s] - write(15, 84, 2156596737, 0); // [time: 157141400s -> 157141480s] - write(15, 88, 186359062, 0); // [time: 157141480s -> 157141550s] - write(15, 92, 3868659405, 0); // [time: 157141550s -> 157141630s] - write(15, 96, 1617133504, 0); // [time: 157141630s -> 157141700s] - write(15, 100, 3134092405, 0); // [time: 157141700s -> 157141780s] - write(15, 104, 2246488587, 0); // [time: 157141780s -> 157141850s] - write(15, 108, 2723046980, 0); // [time: 157141850s -> 157141930s] - write(15, 112, 1486549937, 0); // [time: 157141930s -> 157142000s] - write(15, 116, 3286469255, 0); // [time: 157142000s -> 157142080s] - write(15, 120, 4098377448, 0); // [time: 157142080s -> 157142150s] - write(15, 124, 2392678941, 0); // [time: 157142150s -> 157142230s] - write(15, 128, 2473386534, 0); // [time: 157142230s -> 157142300s] - write(15, 132, 1973988843, 0); // [time: 157142300s -> 157142380s] - write(15, 136, 1945895911, 0); // [time: 157142380s -> 157142450s] - write(15, 140, 2928197725, 0); // [time: 157142450s -> 157142530s] - write(15, 144, 1966069738, 0); // [time: 157142530s -> 157142600s] - write(15, 148, 445118261, 0); // [time: 157142600s -> 157142680s] - write(15, 152, 459691318, 0); // [time: 157142680s -> 157142750s] - write(15, 156, 1979121643, 0); // [time: 157142750s -> 157142830s] - write(15, 160, 4257292027, 0); // [time: 157142830s -> 157142900s] - write(15, 164, 529745215, 0); // [time: 157142900s -> 157142980s] - read(15, 40, 2297678865, 0); // [time: 157143060s -> 157143140s] - read(15, 44, 3604862125, 0); // [time: 157143140s -> 157143220s] - read(15, 48, 648269133, 0); // [time: 157143220s -> 157143290s] - read(15, 52, 223519002, 0); // [time: 157143290s -> 157143370s] - read(15, 56, 2069755382, 0); // [time: 157143370s -> 157143460s] - read(15, 60, 2191335941, 0); // [time: 157143460s -> 157143550s] - read(15, 64, 3011745895, 0); // [time: 157143550s -> 157143620s] - read(15, 68, 90880778, 0); // [time: 157143620s -> 157143700s] - read(15, 72, 2066225142, 0); // [time: 157143700s -> 157143790s] - read(15, 76, 3164103289, 0); // [time: 157143790s -> 157143880s] - read(15, 80, 594197318, 0); // [time: 157143880s -> 157143970s] - read(15, 84, 2156596737, 0); // [time: 157143970s -> 157144060s] - read(15, 88, 186359062, 0); // [time: 157144060s -> 157144160s] - read(15, 92, 3868659405, 0); // [time: 157144160s -> 157144250s] - read(15, 96, 1617133504, 0); // [time: 157144250s -> 157144350s] - read(15, 100, 3134092405, 0); // [time: 157144350s -> 157144430s] - read(15, 104, 2246488587, 0); // [time: 157144430s -> 157144510s] - read(15, 108, 2723046980, 0); // [time: 157144510s -> 157144590s] - read(15, 112, 1486549937, 0); // [time: 157144590s -> 157144690s] - read(15, 116, 3286469255, 0); // [time: 157144690s -> 157144770s] - read(15, 120, 4098377448, 0); // [time: 157144770s -> 157144840s] - read(15, 124, 2392678941, 0); // [time: 157144840s -> 157144930s] - read(15, 128, 2473386534, 0); // [time: 157144930s -> 157145030s] - read(15, 132, 1973988843, 0); // [time: 157145030s -> 157145120s] - read(15, 136, 1945895911, 0); // [time: 157145120s -> 157145210s] - read(15, 140, 2928197725, 0); // [time: 157145210s -> 157145290s] - read(15, 144, 1966069738, 0); // [time: 157145290s -> 157145380s] - read(15, 148, 445118261, 0); // [time: 157145380s -> 157145460s] - read(15, 152, 459691318, 0); // [time: 157145460s -> 157145530s] - read(15, 156, 1979121643, 0); // [time: 157145530s -> 157145600s] - read(15, 160, 4257292027, 0); // [time: 157145600s -> 157145680s] - read(15, 164, 529745215, 0); // [time: 157145680s -> 157145770s] - write(15, 144, 100689676, 0); // [time: 157145850s -> 157145920s] - write(15, 144, 942429552, 0); // [time: 157145920s -> 157145990s] - write(15, 144, 2379269659, 0); // [time: 157145990s -> 157146070s] - write(15, 144, 3999281884, 0); // [time: 157146070s -> 157146140s] - write(15, 144, 4119078123, 0); // [time: 157146140s -> 157146220s] - write(15, 144, 1946599400, 0); // [time: 157146220s -> 157146290s] - write(15, 144, 4276983549, 0); // [time: 157146290s -> 157146370s] - write(15, 144, 3399752341, 0); // [time: 157146370s -> 157146440s] - write(15, 144, 3017292903, 0); // [time: 157146440s -> 157146520s] - write(15, 144, 972684659, 0); // [time: 157146520s -> 157146590s] - write(15, 144, 441524532, 0); // [time: 157146590s -> 157146670s] - write(15, 144, 1334844831, 0); // [time: 157146670s -> 157146740s] - write(15, 144, 565975363, 0); // [time: 157146740s -> 157146820s] - write(15, 144, 2815133775, 0); // [time: 157146820s -> 157146890s] - write(15, 140, 980134772, 0); // [time: 157146970s -> 157147040s] - write(15, 140, 3907850449, 0); // [time: 157147040s -> 157147120s] - write(15, 140, 2654200892, 0); // [time: 157147120s -> 157147190s] - write(15, 140, 906927468, 0); // [time: 157147190s -> 157147270s] - write(15, 140, 2737849414, 0); // [time: 157147270s -> 157147340s] - write(15, 140, 1677170119, 0); // [time: 157147340s -> 157147420s] - write(15, 140, 850693989, 0); // [time: 157147420s -> 157147490s] - write(15, 140, 1398815142, 0); // [time: 157147490s -> 157147570s] - write(15, 140, 3709909178, 0); // [time: 157147570s -> 157147640s] - write(15, 140, 1945896423, 0); // [time: 157147640s -> 157147720s] - write(15, 140, 2953822816, 0); // [time: 157147720s -> 157147790s] - write(15, 140, 2304971794, 0); // [time: 157147790s -> 157147870s] - write(15, 140, 521770302, 0); // [time: 157147870s -> 157147940s] - write(15, 140, 3333586061, 0); // [time: 157147940s -> 157148020s] - read(15, 44, 3604862125, 0); // [time: 157148100s -> 157148180s] - read(15, 92, 3868659405, 0); // [time: 157148260s -> 157148350s] - write(15, 124, 2820663376, 0); // [time: 157148430s -> 157148500s] - write(15, 64, 662417230, 0); // [time: 157148500s -> 157148570s] - write(15, 68, 2464031269, 0); // [time: 157148570s -> 157148650s] - write(15, 72, 73062664, 0); // [time: 157148650s -> 157148720s] - write(15, 76, 4029952224, 0); // [time: 157148720s -> 157148800s] - write(15, 80, 793527134, 0); // [time: 157148800s -> 157148870s] - write(15, 84, 6582016, 0); // [time: 157148870s -> 157148950s] - write(15, 88, 3617108655, 0); // [time: 157148950s -> 157149020s] - write(15, 92, 406619440, 0); // [time: 157149020s -> 157149100s] - write(15, 96, 4277193981, 0); // [time: 157149100s -> 157149170s] - write(15, 100, 736184151, 0); // [time: 157149170s -> 157149250s] - write(15, 104, 3641666226, 0); // [time: 157149250s -> 157149320s] - write(15, 108, 45454085, 0); // [time: 157149320s -> 157149400s] - write(15, 112, 4110092521, 0); // [time: 157149400s -> 157149470s] - write(15, 116, 4069799141, 0); // [time: 157149470s -> 157149550s] - write(15, 120, 4206762229, 0); // [time: 157149550s -> 157149620s] - write(15, 124, 2304033810, 0); // [time: 157149620s -> 157149700s] - write(15, 64, 170815764, 0); // [time: 157149700s -> 157149770s] - write(15, 68, 4065560292, 0); // [time: 157149770s -> 157149850s] - write(15, 128, 3474693278, 0); // [time: 157149930s -> 157150000s] - write(15, 128, 3665053876, 0); // [time: 157150000s -> 157150070s] - write(15, 128, 486294841, 0); // [time: 157150070s -> 157150150s] - write(15, 128, 1205356431, 0); // [time: 157150150s -> 157150220s] - write(15, 128, 3354562191, 0); // [time: 157150220s -> 157150300s] - write(15, 128, 4215211766, 0); // [time: 157150300s -> 157150370s] - write(15, 128, 1790934485, 0); // [time: 157150370s -> 157150450s] - write(15, 128, 2949267551, 0); // [time: 157150450s -> 157150520s] -} diff --git a/tests/wishbone/expects/wishbone.monitor.expect b/tests/wishbone/expects/wishbone.bi.expect similarity index 100% rename from tests/wishbone/expects/wishbone.monitor.expect rename to tests/wishbone/expects/wishbone.bi.expect diff --git a/tests/wishbone/wishbone.monitor.prot b/tests/wishbone/wishbone.bi.prot similarity index 100% rename from tests/wishbone/wishbone.monitor.prot rename to tests/wishbone/wishbone.bi.prot diff --git a/uv.lock b/uv.lock index 204847f7..f1f647a9 100644 --- a/uv.lock +++ b/uv.lock @@ -2,406 +2,10 @@ version = 1 revision = 3 requires-python = ">=3.12" -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "contourpy" -version = "1.3.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, - { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, - { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, - { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, - { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, - { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, - { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, - { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, - { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, - { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, - { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, - { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, - { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, - { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, - { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, - { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, - { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, - { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, - { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, - { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, - { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, - { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, - { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, - { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, - { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, - { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, - { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, - { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, - { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, - { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, - { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, - { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, - { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, - { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, -] - -[[package]] -name = "cycler" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, -] - -[[package]] -name = "fonttools" -version = "4.61.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, - { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, - { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, - { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, - { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, - { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, - { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, - { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, - { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, - { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, - { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, - { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, - { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, - { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, - { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, - { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, - { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, - { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, - { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, -] - -[[package]] -name = "kiwisolver" -version = "1.4.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, - { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, - { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, - { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, - { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, - { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, - { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, - { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, - { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, - { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, - { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, - { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, - { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, - { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, - { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, - { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, - { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, - { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, - { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, - { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, - { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, - { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, - { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, - { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, - { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, - { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, - { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, - { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, - { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, - { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, - { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, - { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, - { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, - { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, -] - -[[package]] -name = "matplotlib" -version = "3.10.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "contourpy" }, - { name = "cycler" }, - { name = "fonttools" }, - { name = "kiwisolver" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyparsing" }, - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, - { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, - { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, - { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, - { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, - { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, - { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, - { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, - { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, - { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, - { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, - { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, - { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, - { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, - { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, - { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, - { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, - { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, - { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, - { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, - { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, -] - -[[package]] -name = "numpy" -version = "2.3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, -] - -[[package]] -name = "packaging" -version = "25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, -] - -[[package]] -name = "pillow" -version = "12.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, - { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, - { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, - { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, - { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, - { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, - { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, - { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, - { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, - { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, - { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, - { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, - { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, - { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, - { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, - { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, - { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, - { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, - { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, - { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, - { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, - { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, - { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, - { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, - { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, - { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, - { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, - { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, - { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, - { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, - { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, - { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, - { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, - { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, - { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, - { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, - { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, - { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, - { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, - { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, - { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, -] - [[package]] name = "protocols" version = "0.1.0" source = { virtual = "." } -dependencies = [ - { name = "matplotlib" }, - { name = "tqdm" }, -] [package.dev-dependencies] dev = [ @@ -410,10 +14,6 @@ dev = [ ] [package.metadata] -requires-dist = [ - { name = "matplotlib", specifier = ">=3.10.8" }, - { name = "tqdm", specifier = ">=4.67.1" }, -] [package.metadata.requires-dev] dev = [ @@ -421,27 +21,6 @@ dev = [ { name = "ty", specifier = ">=0.0.17" }, ] -[[package]] -name = "pyparsing" -version = "3.2.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - [[package]] name = "ruff" version = "0.15.1" @@ -467,27 +46,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, ] -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, -] - [[package]] name = "ty" version = "0.0.17" diff --git a/well-formedness.md b/well-formedness.md index 11601b0f..97a6ce93 100644 --- a/well-formedness.md +++ b/well-formedness.md @@ -8,7 +8,6 @@ This document details the well-formedness constraints on `.prot` programs: - We also check that assignments, assertions and conditionals (`if` and `while`) abide by the grammars discussed below. These grammars are designed in order to make it tractable to reconstruct transactions from a waveform and `.prot` file -(which is what the monitor does) ### Grammar for assignments - In assignments `LHS := RHS`, `LHS` & `RHS` must conform to the following grammar: