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;
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)));
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)
);
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)
);
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)
);
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)
);
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)
);
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)
);
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
(* 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
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
(* 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
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
(* 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