From 309b7d2496c00b0f02634048be7dcfee7d91b716 Mon Sep 17 00:00:00 2001 From: nella Date: Fri, 12 Jun 2026 14:55:47 +0200 Subject: [PATCH] Verify kogge stone impl. --- passes/tests/CMakeLists.txt | 3 + passes/tests/test_kogge_stone.cc | 101 ++++++++++++++++++++++++++ tests/arith_tree/kogge_stone_equiv.ys | 67 +++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 passes/tests/test_kogge_stone.cc create mode 100644 tests/arith_tree/kogge_stone_equiv.ys diff --git a/passes/tests/CMakeLists.txt b/passes/tests/CMakeLists.txt index 007339ac5..5cedacf81 100644 --- a/passes/tests/CMakeLists.txt +++ b/passes/tests/CMakeLists.txt @@ -7,6 +7,9 @@ yosys_test_pass(cell yosys_test_pass(abcloop test_abcloop.cc ) +yosys_test_pass(kogge_stone + test_kogge_stone.cc +) yosys_pass(raise_error raise_error.cc diff --git a/passes/tests/test_kogge_stone.cc b/passes/tests/test_kogge_stone.cc new file mode 100644 index 000000000..95b97bb14 --- /dev/null +++ b/passes/tests/test_kogge_stone.cc @@ -0,0 +1,101 @@ +#include "kernel/compressor_tree.h" +#include "kernel/yosys.h" + +USING_YOSYS_NAMESPACE +PRIVATE_NAMESPACE_BEGIN + +static void build_lcu_adder(Module *module, SigSpec a, SigSpec b, SigSpec y) +{ + int width = GetSize(y); + + SigSpec p = module->Xor(NEW_ID, a, b); + SigSpec g = module->And(NEW_ID, a, b); + + SigSpec co = module->addWire(NEW_ID, width); + Cell *lcu = module->addCell(NEW_ID, ID($lcu)); + lcu->setParam(ID::WIDTH, width); + lcu->setPort(ID::P, p); + lcu->setPort(ID::G, g); + lcu->setPort(ID::CI, State::S0); + lcu->setPort(ID::CO, co); + + SigSpec carry_in; + carry_in.append(State::S0); + carry_in.append(co.extract(0, width - 1)); + module->addXor(NEW_ID, p, carry_in, y); +} + +static Module *make_module(Design *design, IdString name, int width) +{ + Module *module = design->addModule(name); + + Wire *a = module->addWire(ID(a), width); + a->port_input = true; + Wire *b = module->addWire(ID(b), width); + b->port_input = true; + Wire *y = module->addWire(ID(y), width); + y->port_output = true; + module->fixup_ports(); + + return module; +} + +struct TestKoggeStonePass : public Pass { + TestKoggeStonePass() : Pass("test_kogge_stone", "build adders for Kogge-Stone equivalence testing") {} + void help() override + { + // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| + log("\n"); + log(" test_kogge_stone [options]\n"); + log("\n"); + log("Build two modules implementing an unsigned 'y = a + b' adder of a given width,\n"); + log("and compare various internal Kogge-Stone adders.\n"); + log("\n"); + log(" -width N\n"); + log(" width of the operands and result (default = 16)\n"); + log("\n"); + log(" -gold name\n"); + log(" name of the $lcu-based reference module (default = gold)\n"); + log("\n"); + log(" -gate name\n"); + log(" name of the emit_kogge_stone() module (default = gate)\n"); + log("\n"); + } + void execute(std::vector args, Design *design) override + { + int width = 16; + IdString gold_name = ID(gold); + IdString gate_name = ID(gate); + + size_t argidx; + for (argidx = 1; argidx < args.size(); argidx++) { + if (args[argidx] == "-width" && argidx + 1 < args.size()) { + width = atoi(args[++argidx].c_str()); + continue; + } + if (args[argidx] == "-gold" && argidx + 1 < args.size()) { + gold_name = RTLIL::escape_id(args[++argidx]); + continue; + } + if (args[argidx] == "-gate" && argidx + 1 < args.size()) { + gate_name = RTLIL::escape_id(args[++argidx]); + continue; + } + break; + } + extra_args(args, argidx, design, false); + + if (width < 1) + log_cmd_error("Width must be at least 1.\n"); + + log_header(design, "Executing TEST_KOGGE_STONE pass (width=%d).\n", width); + + Module *gold = make_module(design, gold_name, width); + build_lcu_adder(gold, gold->wire(ID(a)), gold->wire(ID(b)), gold->wire(ID(y))); + + Module *gate = make_module(design, gate_name, width); + CompressorTree::emit_kogge_stone(gate, gate->wire(ID(a)), gate->wire(ID(b)), gate->wire(ID(y))); + } +} TestKoggeStonePass; + +PRIVATE_NAMESPACE_END diff --git a/tests/arith_tree/kogge_stone_equiv.ys b/tests/arith_tree/kogge_stone_equiv.ys new file mode 100644 index 000000000..beceeadc2 --- /dev/null +++ b/tests/arith_tree/kogge_stone_equiv.ys @@ -0,0 +1,67 @@ +# Verify that CompressorTree::emit_kogge_stone() is eq to the implementation in techlibs/common/choices/kogge-stone.v + +test_kogge_stone -width 1 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 2 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 3 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 4 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 5 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 7 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 8 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 16 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 17 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 32 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset + +test_kogge_stone -width 33 +techmap -map +/choices/kogge-stone.v gold +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 miter +design -reset