diff --git a/tests/techmap/dfflibmap-sim.v b/tests/techmap/dfflibmap-sim.v index 1788a683b..42006a211 100644 --- a/tests/techmap/dfflibmap-sim.v +++ b/tests/techmap/dfflibmap-sim.v @@ -20,3 +20,12 @@ always @(posedge CLK, posedge CLEAR, posedge PRESET) assign QN = ~Q; endmodule + +module dffe(input CLK, EN, D, output reg Q, output QN); + +always @(negedge CLK) + if (EN) Q <= D; + +assign QN = ~Q; + +endmodule diff --git a/tests/techmap/dfflibmap.lib b/tests/techmap/dfflibmap.lib index ce460877e..d0cd472c3 100644 --- a/tests/techmap/dfflibmap.lib +++ b/tests/techmap/dfflibmap.lib @@ -5,7 +5,7 @@ library(test) { ff("IQ", "IQN") { next_state : "D"; clocked_on : "!CLK"; - } + } pin(D) { direction : input; } @@ -19,7 +19,7 @@ library(test) { pin(QN) { direction: output; function : "IQN"; - } + } } cell (dffsr) { area : 6; @@ -30,7 +30,7 @@ library(test) { preset : "PRESET"; clear_preset_var1 : L; clear_preset_var2 : L; - } + } pin(D) { direction : input; } @@ -50,6 +50,30 @@ library(test) { pin(QN) { direction: output; function : "IQN"; - } + } + } + cell (dffe) { + area : 6; + ff("IQ", "IQN") { + next_state : "(D&EN) | (IQ&!EN)"; + clocked_on : "!CLK"; + } + pin(D) { + direction : input; + } + pin(EN) { + direction : input; + } + pin(CLK) { + direction : input; + } + pin(Q) { + direction: output; + function : "IQ"; + } + pin(QN) { + direction: output; + function : "IQN"; + } } } diff --git a/tests/techmap/dfflibmap.ys b/tests/techmap/dfflibmap.ys index e9ba31969..4b485a450 100644 --- a/tests/techmap/dfflibmap.ys +++ b/tests/techmap/dfflibmap.ys @@ -1,14 +1,15 @@ read_verilog -icells <<EOT -module top(input C, D, S, R, output [9:0] Q); +module top(input C, D, E, S, R, output [11:0] Q); $_DFF_P_ ff0 (.C(C), .D(D), .Q(Q[0])); $_DFF_PP0_ ff1 (.C(C), .D(D), .R(R), .Q(Q[1])); $_DFF_PP1_ ff2 (.C(C), .D(D), .R(R), .Q(Q[2])); $_DFFSR_PPP_ ff3 (.C(C), .D(D), .R(R), .S(S), .Q(Q[3])); $_DFFSR_NNN_ ff4 (.C(C), .D(D), .R(R), .S(S), .Q(Q[4])); +$_DFFE_PP_ ff5 (.C(C), .D(D), .E(E), .Q(Q[5])); -assign Q[9:5] = ~Q[4:0]; +assign Q[11:6] = ~Q[5:0]; endmodule @@ -29,23 +30,25 @@ design -load orig dfflibmap -liberty dfflibmap.lib clean -select -assert-count 4 t:$_NOT_ +select -assert-count 5 t:$_NOT_ select -assert-count 1 t:dffn select -assert-count 4 t:dffsr -select -assert-none t:dffn t:dffsr t:$_NOT_ %% %n t:* %i +select -assert-count 1 t:dffe +select -assert-none t:dffn t:dffsr t:dffe t:$_NOT_ %% %n t:* %i design -load orig dfflibmap -prepare -liberty dfflibmap.lib -select -assert-count 9 t:$_NOT_ +select -assert-count 11 t:$_NOT_ select -assert-count 1 t:$_DFF_N_ select -assert-count 4 t:$_DFFSR_PPP_ -select -assert-none t:$_DFF_N_ t:$_DFFSR_PPP_ t:$_NOT_ %% %n t:* %i +select -assert-count 1 t:$_DFFE_NP_ +select -assert-none t:$_DFF_N_ t:$_DFFSR_PPP_ t:$_DFFE_NP_ t:$_NOT_ %% %n t:* %i design -load orig dfflibmap -map-only -liberty dfflibmap.lib -select -assert-count 5 t:$_NOT_ +select -assert-count 6 t:$_NOT_ select -assert-count 0 t:dffn select -assert-count 1 t:dffsr @@ -54,10 +57,11 @@ dfflibmap -prepare -liberty dfflibmap.lib dfflibmap -map-only -liberty dfflibmap.lib clean -select -assert-count 4 t:$_NOT_ +select -assert-count 5 t:$_NOT_ select -assert-count 1 t:dffn select -assert-count 4 t:dffsr -select -assert-none t:dffn t:dffsr t:$_NOT_ %% %n t:* %i +select -assert-count 1 t:dffe +select -assert-none t:dffn t:dffsr t:dffe t:$_NOT_ %% %n t:* %i design -load orig dfflibmap -prepare -liberty dfflibmap_dffn.lib -liberty dfflibmap_dffsr.lib @@ -75,3 +79,4 @@ clean select -assert-count 0 t:dffn select -assert-count 5 t:dffsr +select -assert-count 1 t:dffe