| read_verilog <<EOT |
| (* techmap_celltype = "$_DFF_P_" *) |
| module ffmap(...); |
| input D; |
| input C; |
| output Q; |
| parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx; |
| |
| ffbb #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_(.D(D), .Q(Q), .C(C)); |
| |
| wire _TECHMAP_FAIL_ = _TECHMAP_WIREINIT_Q_ === 1'b1; |
| |
| wire _TECHMAP_REMOVEINIT_Q_ = 1'b1; |
| |
| endmodule |
| EOT |
| design -stash map |
| |
| read_verilog <<EOT |
| (* techmap_celltype = "$_DFF_P_" *) |
| module ffmap(...); |
| input D; |
| input C; |
| output Q; |
| parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx; |
| |
| ffbb #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_(.D(D), .Q(Q), .C(C)); |
| |
| wire _TECHMAP_FAIL_ = _TECHMAP_WIREINIT_Q_ === 1'b1; |
| |
| wire _TECHMAP_REMOVEINIT_Q_ = 1'b0; |
| |
| endmodule |
| EOT |
| design -stash map_noremove |
| |
| read_verilog <<EOT |
| module ffbb (...); |
| parameter [0:0] INIT = 1'bx; |
| input D, C; |
| output Q; |
| endmodule |
| |
| module top(...); |
| input clk; |
| input d; |
| output reg q0 = 0; |
| output reg q1 = 1; |
| output reg qq0 = 0; |
| output reg qx; |
| |
| always @(posedge clk) begin |
| q0 <= d; |
| q1 <= d; |
| qq0 <= q0; |
| qx <= d; |
| end |
| endmodule |
| EOT |
| |
| design -save ref |
| |
| hierarchy -auto-top |
| proc |
| simplemap |
| techmap -map %map |
| clean |
| # Make sure the parameter was used properly. |
| select -assert-count 3 top/t:ffbb |
| select -set ff0 top/w:q0 %ci t:ffbb %i |
| select -set ffq0 top/w:qq0 %ci t:ffbb %i |
| select -set ffx top/w:qx %ci t:ffbb %i |
| select -assert-count 1 @ff0 |
| select -assert-count 1 @ffq0 |
| select -assert-count 1 @ffx |
| select -assert-count 1 @ff0 r:INIT=1'b0 %i |
| select -assert-count 1 @ffq0 r:INIT=1'b0 %i |
| select -assert-count 1 @ffx r:INIT=1'bx %i |
| select -assert-count 0 top/w:q1 %ci t:ffbb %i |
| # Make sure the init values are dropped from the wires iff mapping was performed. |
| select -assert-count 0 top/w:q0 a:init %i |
| select -assert-count 0 top/w:qq0 a:init %i |
| select -assert-count 1 top/w:q1 a:init=1'b1 %i |
| select -assert-count 0 top/w:qx a:init %i |
| |
| design -load ref |
| hierarchy -auto-top |
| proc |
| simplemap |
| techmap -map %map_noremove |
| clean |
| # Make sure the parameter was used properly. |
| select -assert-count 3 top/t:ffbb |
| select -set ff0 top/w:q0 %ci t:ffbb %i |
| select -set ffq0 top/w:qq0 %ci t:ffbb %i |
| select -set ffx top/w:qx %ci t:ffbb %i |
| select -assert-count 1 @ff0 |
| select -assert-count 1 @ffq0 |
| select -assert-count 1 @ffx |
| select -assert-count 1 @ff0 r:INIT=1'b0 %i |
| select -assert-count 1 @ffq0 r:INIT=1'b0 %i |
| select -assert-count 1 @ffx r:INIT=1'bx %i |
| select -assert-count 0 top/w:q1 %ci t:ffbb %i |
| # Make sure the init values are not dropped from the wires. |
| select -assert-count 1 top/w:q0 a:init=1'b0 %i |
| select -assert-count 1 top/w:qq0 a:init=1'b0 %i |
| select -assert-count 1 top/w:q1 a:init=1'b1 %i |
| select -assert-count 0 top/w:qx a:init %i |