Use attributes instead of params
authorEddie Hung <eddie@fpgeh.com>
Mon, 19 Aug 2019 16:51:49 +0000 (09:51 -0700)
committerEddie Hung <eddie@fpgeh.com>
Mon, 19 Aug 2019 16:51:49 +0000 (09:51 -0700)
passes/techmap/abc9.cc
techlibs/xilinx/abc_ff.v

index df62b4fa52bd8d9d072ee6dcd4141aaa72d7137a..d52be1836f2a8e4ef3d7679749c7124faebdcf8f 100644 (file)
@@ -646,12 +646,8 @@ void abc9_module(RTLIL::Design *design, RTLIL::Module *current_module, std::stri
                                cell->parameters = existing_cell->parameters;
                                cell->attributes = existing_cell->attributes;
 
-                               auto it = cell->parameters.find("\\$abc_flop_clk_pol");
-                               if (it != cell->parameters.end())
-                                       cell->parameters.erase(it);
-                               it = cell->parameters.find("\\$abc_flop_en_pol");
-                               if (it != cell->parameters.end())
-                                       cell->parameters.erase(it);
+                               cell->attributes.erase("\\abc_flop_clk_pol");
+                               cell->attributes.erase("\\abc_flop_en_pol");
                        }
                        else {
                                cell->parameters = mapped_cell->parameters;
@@ -1265,14 +1261,32 @@ struct Abc9Pass : public Pass {
                                                continue;
                                }
 
-                               auto jt = cell->parameters.find("\\$abc_flop_clk_pol");
+                               auto jt = cell->attributes.find("\\abc_flop_clk_pol");
                                if (jt == cell->parameters.end())
-                                       log_error("'$abc_flop_clk_pol' parameter not found on module '%s'.\n", log_id(cell->type));
-                               bool this_clk_pol = jt->second.as_bool();
+                                       log_error("'abc_flop_clk_pol' attribute not found on module '%s'.\n", log_id(cell->type));
+                               bool this_clk_pol;
+                               if (jt->second.flags == RTLIL::ConstFlags::CONST_FLAG_STRING) {
+                                       auto param = jt->second.decode_string();
+                                       auto kt = cell->parameters.find(param);
+                                       if (kt == cell->parameters.end())
+                                               log_error("'abc_flop_clk_pol' value '%s' is not a parameter on module '%s'.\n", param.c_str(), log_id(cell->type));
+                                       this_clk_pol = kt->second.as_bool();
+                               }
+                               else
+                                       this_clk_pol = jt->second.as_bool();
                                jt = cell->parameters.find("\\$abc_flop_en_pol");
                                if (jt == cell->parameters.end())
-                                       log_error("'$abc_flop_en_pol' parameter not found on module '%s'.\n", log_id(cell->type));
-                               bool this_en_pol = jt->second.as_bool();
+                                       log_error("'abc_flop_en_pol' attribute not found on module '%s'.\n", log_id(cell->type));
+                               bool this_en_pol;
+                               if (jt->second.flags == RTLIL::ConstFlags::CONST_FLAG_STRING) {
+                                       auto param = jt->second.decode_string();
+                                       auto kt = cell->parameters.find(param);
+                                       if (kt == cell->parameters.end())
+                                               log_error("'abc_flop_en_pol' value '%s' is not a parameter on module '%s'.\n", param.c_str(), log_id(cell->type));
+                                       this_en_pol = kt->second.as_bool();
+                               }
+                               else
+                                       this_en_pol = jt->second.as_bool();
 
                                const auto &data = it->second;
                                key = clkdomain_t(this_clk_pol, assign_map(cell->getPort(data.first)), this_en_pol, assign_map(cell->getPort(data.second)));
index 19f86365a8709b2bc43560a95dcc183d10e62879..1d308fa9643a124847173b5fd5486840fbe7c1ca 100644 (file)
@@ -26,13 +26,12 @@ module FDRE (output reg Q, input C, CE, D, R);
   parameter [0:0] IS_D_INVERTED = 1'b0;
   parameter [0:0] IS_R_INVERTED = 1'b0;
   wire \$nextQ ;
+  (* abc_flop_clk_pol="!IS_C_INVERTED", abc_flop_en_pol=1 *)
   \$__ABC_FDRE #(
     .INIT(INIT),
     .IS_C_INVERTED(IS_C_INVERTED),
     .IS_D_INVERTED(IS_D_INVERTED),
-    .IS_R_INVERTED(IS_R_INVERTED),
-    .\$abc_flop_clk_pol (!IS_C_INVERTED),
-    .\$abc_flop_en_pol (1'b1)
+    .IS_R_INVERTED(IS_R_INVERTED)
   ) _TECHMAP_REPLACE_ (
     .D(D), .Q(\$nextQ ), .\$pastQ (Q), .C(C), .CE(CE), .R(R)
   );
@@ -41,9 +40,8 @@ endmodule
 module FDRE_1 (output reg Q, input C, CE, D, R);
   parameter [0:0] INIT = 1'b0;
   wire \$nextQ ;
-  \$__ABC_FDRE_1 #(.INIT(|0),
-    .\$abc_flop_clk_pol (1'b1),
-    .\$abc_flop_en_pol (1'b1)
+  (* abc_flop_clk_pol=1, abc_flop_en_pol=1 *)
+  \$__ABC_FDRE_1 #(.INIT(|0)
   ) _TECHMAP_REPLACE_ (
     .D(D), .Q(\$nextQ ), .\$pastQ (Q), .C(C), .CE(CE), .R(R)
   );
@@ -56,13 +54,12 @@ module FDCE (output reg Q, input C, CE, D, CLR);
   parameter [0:0] IS_D_INVERTED = 1'b0;
   parameter [0:0] IS_CLR_INVERTED = 1'b0;
   wire \$nextQ , \$currQ ;
+  (* abc_flop_clk_pol="!IS_C_INVERTED", abc_flop_en_pol=1 *)
   \$__ABC_FDCE #(
     .INIT(INIT),
     .IS_C_INVERTED(IS_C_INVERTED),
     .IS_D_INVERTED(IS_D_INVERTED),
-    .IS_CLR_INVERTED(IS_CLR_INVERTED),
-    .\$abc_flop_clk_pol (!IS_C_INVERTED),
-    .\$abc_flop_en_pol (1'b1)
+    .IS_CLR_INVERTED(IS_CLR_INVERTED)
   ) _TECHMAP_REPLACE_ (
     .D(D), .Q(\$nextQ ), .\$pastQ (Q), .C(C), .CE(CE), .CLR(CLR)
   );
@@ -72,10 +69,9 @@ endmodule
 module FDCE_1 (output reg Q, input C, CE, D, CLR);
   parameter [0:0] INIT = 1'b0;
   wire \$nextQ , \$currQ ;
+  (* abc_flop_clk_pol=1, abc_flop_en_pol=1 *)
   \$__ABC_FDCE_1 #(
-    .INIT(INIT),
-    .\$abc_flop_clk_pol (1'b1),
-    .\$abc_flop_en_pol (1'b1)
+    .INIT(INIT)
   ) _TECHMAP_REPLACE_ (
     .D(D), .Q(\$nextQ ), .\$pastQ (Q), .C(C), .CE(CE), .CLR(CLR)
   );
@@ -89,13 +85,12 @@ module FDPE (output reg Q, input C, CE, D, PRE);
   parameter [0:0] IS_D_INVERTED = 1'b0;
   parameter [0:0] IS_PRE_INVERTED = 1'b0;
   wire \$nextQ , \$currQ ;
+  (* abc_flop_clk_pol="!IS_C_INVERTED", abc_flop_en_pol=1 *)
   \$__ABC_FDPE #(
     .INIT(INIT),
     .IS_C_INVERTED(IS_C_INVERTED),
     .IS_D_INVERTED(IS_D_INVERTED),
-    .IS_PRE_INVERTED(IS_PRE_INVERTED),
-    .\$abc_flop_clk_pol (!IS_C_INVERTED),
-    .\$abc_flop_en_pol (1'b1)
+    .IS_PRE_INVERTED(IS_PRE_INVERTED)
   ) _TECHMAP_REPLACE_ (
     .D(D), .Q(\$nextQ ), .\$pastQ (Q), .C(C), .CE(CE), .PRE(PRE)
   );
@@ -105,10 +100,9 @@ endmodule
 module FDPE_1 (output reg Q, input C, CE, D, PRE);
   parameter [0:0] INIT = 1'b0;
   wire \$nextQ , \$currQ ;
+  (* abc_flop_clk_pol=1, abc_flop_en_pol=1 *)
   \$__ABC_FDPE_1 #(
-    .INIT(INIT),
-    .\$abc_flop_clk_pol (1'b1),
-    .\$abc_flop_en_pol (1'b1)
+    .INIT(INIT)
   ) _TECHMAP_REPLACE_ (
     .D(D), .Q(\$nextQ ), .\$pastQ (Q), .C(C), .CE(CE), .PRE(PRE)
   );
@@ -134,8 +128,6 @@ module \$__ABC_FDRE ((* abc_flop_q *)   output Q,
   parameter [0:0] IS_C_INVERTED = 1'b0;
   parameter [0:0] IS_D_INVERTED = 1'b0;
   parameter [0:0] IS_R_INVERTED = 1'b0;
-  parameter \$abc_flop_clk_pol = ~IS_C_INVERTED;
-  parameter \$abc_flop_en_pol = 1'b1;
   assign Q = (R ^ IS_R_INVERTED) ? 1'b0 : (CE ? (D ^ IS_D_INVERTED) : \$pastQ );
 endmodule
 
@@ -146,8 +138,6 @@ module \$__ABC_FDRE_1 ((* abc_flop_q *)   output Q,
                        (* abc_flop_d *)   input D,
                        input R, \$pastQ );
   parameter [0:0] INIT = 1'b0;
-  parameter \$abc_flop_clk_pol = 1'b0;
-  parameter \$abc_flop_en_pol = 1'b1;
   assign Q = R ? 1'b0 : (CE ? D : \$pastQ );
 endmodule
 
@@ -161,8 +151,6 @@ module \$__ABC_FDCE ((* abc_flop_q *)   output Q,
   parameter [0:0] IS_C_INVERTED = 1'b0;
   parameter [0:0] IS_D_INVERTED = 1'b0;
   parameter [0:0] IS_CLR_INVERTED = 1'b0;
-  parameter \$abc_flop_clk_pol = ~IS_C_INVERTED;
-  parameter \$abc_flop_en_pol = 1'b1;
   assign Q = (CE && !(CLR ^ IS_CLR_INVERTED)) ? (D ^ IS_D_INVERTED) : \$pastQ ;
 endmodule
 
@@ -173,8 +161,6 @@ module \$__ABC_FDCE_1 ((* abc_flop_q *)   output Q,
                        (* abc_flop_d *)   input D,
                        input CLR, \$pastQ );
   parameter [0:0] INIT = 1'b0;
-  parameter \$abc_flop_clk_pol = 1'b0;
-  parameter \$abc_flop_en_inv = 1'b1;
   assign Q = (CE && !CLR) ? D : \$pastQ ;
 endmodule
 
@@ -188,8 +174,6 @@ module \$__ABC_FDPE ((* abc_flop_q *)   output Q,
   parameter [0:0] IS_C_INVERTED = 1'b0;
   parameter [0:0] IS_D_INVERTED = 1'b0;
   parameter [0:0] IS_PRE_INVERTED = 1'b0;
-  parameter \$abc_flop_clk_pol = ~IS_C_INVERTED;
-  parameter \$abc_flop_en_pol = 1'b1;
   assign Q = (CE && !(PRE ^ IS_PRE_INVERTED)) ? (D ^ IS_D_INVERTED) : \$pastQ ;
 endmodule
 
@@ -200,8 +184,6 @@ module \$__ABC_FDPE_1 ((* abc_flop_q *)   output Q,
                        (* abc_flop_d *)   input D,
                        input PRE, \$pastQ );
   parameter [0:0] INIT = 1'b0;
-  parameter \$abc_flop_clk_pol = 1'b0;
-  parameter \$abc_flop_en_pol = 1'b1;
   assign Q = (CE && !PRE) ? D : \$pastQ ;
 endmodule