From 725c489c7e1daa928030d8be6842892db1c0f175 Mon Sep 17 00:00:00 2001 From: Anhijkt <mihail.ershov.zp@gmail.com> Date: Sat, 15 Mar 2025 17:11:32 +0200 Subject: [PATCH 1/4] ice40_dsp: fix log_assert issue --- techlibs/ice40/ice40_dsp.pmg | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/techlibs/ice40/ice40_dsp.pmg b/techlibs/ice40/ice40_dsp.pmg index 9099dd3c4..285e3ceee 100644 --- a/techlibs/ice40/ice40_dsp.pmg +++ b/techlibs/ice40/ice40_dsp.pmg @@ -46,17 +46,19 @@ code sigA sigB sigH // Only care about those bits that are used int i; - for (i = 0; i < GetSize(O); i++) { - if (nusers(O[i]) <= 1) - break; - sigH.append(O[i]); - } + for (i = GetSize(O) - 1; i > 0 && nusers(O[i]) <= 1; i--) + ; // This sigM could have no users if downstream sinks (e.g. $add) is // narrower than $mul result, for example if (i == 0) reject; - log_assert(nusers(O.extract_end(i)) <= 1); + for (int j = 0; j <= i; j++) + if (nusers(O[j]) == 0) + sigH.append(module->addWire(NEW_ID)); + else + sigH.append(O[j]); + endcode code argQ ffA sigA clock clock_pol From 5ae32efca5a2018ce8ef41fa1cb30590b0a8aed5 Mon Sep 17 00:00:00 2001 From: Anhijkt <mihail.ershov.zp@gmail.com> Date: Sat, 15 Mar 2025 20:05:57 +0200 Subject: [PATCH 2/4] ice40_dsp: add test --- tests/various/bug4865.ys | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/various/bug4865.ys diff --git a/tests/various/bug4865.ys b/tests/various/bug4865.ys new file mode 100644 index 000000000..ac5a459d8 --- /dev/null +++ b/tests/various/bug4865.ys @@ -0,0 +1,67 @@ +read_rtlil << EOF + +autoidx 524 + +attribute \top 1 +attribute \library "work" +attribute \hdlname "main" +module \main + + attribute \force_downto 1 + wire width 18 $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] + + wire width 14 $delete_wire$514 + + attribute \module_not_derived 1 + cell \SB_MAC16 $verific$mult_4$garbage/usb.v:12$388.etc.sliceB[0].mul + parameter \A_REG 1'0 + parameter \A_SIGNED 0 + parameter \BOTADDSUB_CARRYSELECT 2'00 + parameter \BOTADDSUB_LOWERINPUT 2'00 + parameter \BOTADDSUB_UPPERINPUT 1'0 + parameter \BOTOUTPUT_SELECT 2'11 + parameter \BOT_8x8_MULT_REG 1'0 + parameter \B_REG 1'0 + parameter signed \B_SIGNED 0 + parameter \C_REG 1'0 + parameter \D_REG 1'0 + parameter \MODE_8x8 1'0 + parameter \NEG_TRIGGER 1'0 + parameter \PIPELINE_16x16_MULT_REG1 1'0 + parameter \PIPELINE_16x16_MULT_REG2 1'0 + parameter \TOPADDSUB_CARRYSELECT 2'00 + parameter \TOPADDSUB_LOWERINPUT 2'00 + parameter \TOPADDSUB_UPPERINPUT 1'0 + parameter \TOPOUTPUT_SELECT 2'11 + parameter \TOP_8x8_MULT_REG 1'0 + connect \A 16'x + connect \B 16'x + connect \O { $delete_wire$514 $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] [17:2] 2'x} + end + + cell $add $techmap$verific$mult_4$garbage/usb.v:12$388.etc.sliceA.last.$add$/home/emil/pulls/yosys/share/mul2dsp.v:216$483 + parameter \A_SIGNED 0 + parameter \A_WIDTH 18 + parameter \B_SIGNED 0 + parameter \B_WIDTH 2 + parameter \Y_WIDTH 19 + connect \A 18'x + connect \B $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] [17:16] + connect \Y 19'x + end + + cell $add $techmap$verific$mult_4$garbage/usb.v:12$388.$add$/home/emil/pulls/yosys/share/mul2dsp.v:173$480 + parameter \A_SIGNED 0 + parameter \A_WIDTH 14 + parameter \B_SIGNED 0 + parameter \B_WIDTH 2 + parameter \Y_WIDTH 2 + connect \A $delete_wire$514 + connect \B 2'x + connect \Y 2'x + end + +end +EOF + +ice40_dsp From a9d765e11ef04fda65de4027f1d4b5fa87370f0f Mon Sep 17 00:00:00 2001 From: Anhijkt <mihail.ershov.zp@gmail.com> Date: Sun, 16 Mar 2025 15:11:45 +0200 Subject: [PATCH 3/4] ice40_dsp: group empty wires --- techlibs/ice40/ice40_dsp.pmg | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/techlibs/ice40/ice40_dsp.pmg b/techlibs/ice40/ice40_dsp.pmg index 285e3ceee..63bc8de4b 100644 --- a/techlibs/ice40/ice40_dsp.pmg +++ b/techlibs/ice40/ice40_dsp.pmg @@ -53,11 +53,16 @@ code sigA sigB sigH if (i == 0) reject; - for (int j = 0; j <= i; j++) + for (int j = 0, wire_width = 0; j <= i; j++) if (nusers(O[j]) == 0) - sigH.append(module->addWire(NEW_ID)); - else + wire_width++; + else { + if (wire_width) { // add empty wires for bit offset if needed + sigH.append(module->addWire(NEW_ID, wire_width)); + wire_width = 0; + } sigH.append(O[j]); + } endcode From cb03a1ec2121cde499253c8f3738bac8fdb400b0 Mon Sep 17 00:00:00 2001 From: Anhijkt <mihail.ershov.zp@gmail.com> Date: Wed, 26 Mar 2025 15:13:05 +0200 Subject: [PATCH 4/4] ice40_dsp: fix test --- tests/various/bug4865.ys | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/various/bug4865.ys b/tests/various/bug4865.ys index ac5a459d8..b747c59a7 100644 --- a/tests/various/bug4865.ys +++ b/tests/various/bug4865.ys @@ -1,5 +1,6 @@ read_rtlil << EOF + autoidx 524 attribute \top 1 @@ -10,8 +11,10 @@ module \main attribute \force_downto 1 wire width 18 $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] - wire width 14 $delete_wire$514 + wire width 12 $delete_wire$514 + wire width 4 $test + attribute \module_not_derived 1 cell \SB_MAC16 $verific$mult_4$garbage/usb.v:12$388.etc.sliceB[0].mul parameter \A_REG 1'0 @@ -36,7 +39,7 @@ module \main parameter \TOP_8x8_MULT_REG 1'0 connect \A 16'x connect \B 16'x - connect \O { $delete_wire$514 $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] [17:2] 2'x} + connect \O { $test $delete_wire$514 14'x $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] [1:0] } end cell $add $techmap$verific$mult_4$garbage/usb.v:12$388.etc.sliceA.last.$add$/home/emil/pulls/yosys/share/mul2dsp.v:216$483 @@ -46,17 +49,17 @@ module \main parameter \B_WIDTH 2 parameter \Y_WIDTH 19 connect \A 18'x - connect \B $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] [17:16] + connect \B $verific$mult_4$garbage/usb.v:12$388.etc.blk.partial[0] [1:0] connect \Y 19'x end cell $add $techmap$verific$mult_4$garbage/usb.v:12$388.$add$/home/emil/pulls/yosys/share/mul2dsp.v:173$480 parameter \A_SIGNED 0 - parameter \A_WIDTH 14 + parameter \A_WIDTH 2 parameter \B_SIGNED 0 parameter \B_WIDTH 2 parameter \Y_WIDTH 2 - connect \A $delete_wire$514 + connect \A $delete_wire$514 [1:0] connect \B 2'x connect \Y 2'x end