abc9: uniquify blackboxes like whiteboxes (#2695)
authorEddie Hung <eddie@fpgeh.com>
Tue, 30 Mar 2021 05:02:06 +0000 (22:02 -0700)
committerGitHub <noreply@github.com>
Tue, 30 Mar 2021 05:02:06 +0000 (22:02 -0700)
* abc9_ops: uniquify blackboxes too

* abc9_ops: update comment

* abc9_ops: allow bypass for param-less blackboxes

* Add tests

passes/techmap/abc9_ops.cc
tests/various/abc9.ys

index d3bb31cd9111364252e30601a6f8e1d3575c7f74..6e18cb5f69707466b5b701353b04c36d1b6e105c 100644 (file)
@@ -189,8 +189,6 @@ void prep_hier(RTLIL::Design *design, bool dff_mode)
                                derived_type = inst_module->derive(design, cell->parameters);
                                derived_module = design->module(derived_type);
                        }
-                       if (derived_module->get_blackbox_attribute(true /* ignore_wb */))
-                               continue;
 
                        if (derived_module->get_bool_attribute(ID::abc9_flop)) {
                                if (!dff_mode)
@@ -799,14 +797,12 @@ void prep_xaiger(RTLIL::Module *module, bool dff)
                if (!box_module->get_bool_attribute(ID::abc9_box))
                        continue;
                if (!cell->parameters.empty())
-                       // At this stage of the ABC9 flow, all modules must be nonparametric, because ABC itself requires concrete netlists, and the presence of
-                       // parameters implies a non-concrete netlist. This error needs some explaining, because there are (at least) two ways to get this:
-                       // 1) You have an (* abc9_box *) parametric whitebox but due to a bug somewhere this hasn't been monomorphised into a concrete blackbox.
-                       //    This is a bug, and a bug report would be welcomed.
-                       // 2) You have an (* abc9_box *) parametric blackbox (e.g. to store associated cell data) but want to provide timing data for ABC9.
-                       //    This is not supported due to the presence of parameters. If you want to store associated cell data for a box, one approach could be
-                       //    to techmap the parameters to constant module inputs, and then after ABC9 use _TECHMAP_CONSTVAL_XX_ to retrieve the values again.
-                       log_error("Black box '%s' is marked (* abc9_box *) and has parameters, which is forbidden in prep_xaiger\n", log_id(cell_name));
+               {
+                   // At this stage of the ABC9 flow, all modules must be nonparametric, because ABC itself requires concrete netlists, and the presence of
+                   // parameters implies a non-concrete netlist. This means an (* abc9_box *) parametric module but due to a bug somewhere this hasn't been
+                   // uniquified into a concrete parameter-free module. This is a bug, and a bug report would be welcomed.
+                   log_error("Not expecting parameters on module '%s'  marked (* abc9_box *)\n", log_id(cell_name));
+               }
                log_assert(box_module->get_blackbox_attribute());
 
                cell->attributes[ID::abc9_box_seq] = box_count++;
index a9880c722bfc1c305c0f8dcfbbf2eb8d84702c1a..e0add714b1bed4de4d0e9ad9f15d14373f70a75d 100644 (file)
@@ -90,7 +90,7 @@ $_DFF_N_ ff4(.C(clk), .D(1'b1), .Q(z));
 endmodule
 EOT
 simplemap
-equiv_opt abc9 -lut 4 -dff
+equiv_opt -assert abc9 -lut 4 -dff
 design -load postopt
 cd abc9_test038
 select -assert-count 3 t:$_DFF_N_
@@ -99,3 +99,58 @@ clean
 select -assert-count 2 a:init
 select -assert-count 1 w:w a:init %i
 select -assert-count 1 c:ff4 %co c:ff4 %d %a a:init %i
+
+
+# Check that non-dangling ABC9 black-boxes are preserved
+design -reset
+read_verilog -specify <<EOT
+(* abc9_box, blackbox *)
+module mux_with_param(input I0, I1, S, output O);
+parameter P = 0;
+specify
+    (I0 => O) = P;
+    (I1 => O) = P;
+    (S => O) = P;
+endspecify
+endmodule
+
+module abc9_test039(output O);
+  mux_with_param #(.P(1)) m (
+    .I0(1'b1),
+    .I1(1'b1),
+    .O(O),
+    .S(1'b0)
+  );
+endmodule
+EOT
+abc9 -lut 4
+cd abc9_test039
+select -assert-count 1 t:mux_with_param
+
+
+# Check that dangling ABC9 black-boxes are swept away
+design -reset
+read_verilog -specify <<EOT
+(* abc9_box, blackbox *)
+module mux_with_param(input I0, I1, S, output O);
+parameter P = 0;
+specify
+    (I0 => O) = P;
+    (I1 => O) = P;
+    (S => O) = P;
+endspecify
+endmodule
+
+module abc9_test040(output O);
+  wire w;
+  mux_with_param #(.P(1)) m (
+    .I0(1'b1),
+    .I1(1'b1),
+    .O(w),
+    .S(1'b0)
+  );
+endmodule
+EOT
+abc9 -lut 4
+cd abc9_test040
+select -assert-count 0 t:mux_with_param