blob: 2a1b2b0addc76eca5b262f53edcf647e32399162 [file] [log] [blame]
// type: DFF
`timescale 1ns/10ps
`celldefine
module sky130_osu_sc_DFFXL (Q, QN, D, CK);
output Q, QN;
input D, CK;
reg notifier;
wire delayed_D, delayed_CK;
// Function
wire delayed_D__bar, int_fwire_0, int_fwire_d;
wire int_fwire_IQ, int_fwire_IQN, xcr_0;
not (delayed_D__bar, delayed_D);
and (int_fwire_0, delayed_D__bar, int_fwire_IQ);
or (int_fwire_d, delayed_D, int_fwire_0);
altos_dff_err (xcr_0, delayed_CK, int_fwire_d);
altos_dff (int_fwire_IQ, notifier, delayed_CK, int_fwire_d, xcr_0);
buf (Q, int_fwire_IQ);
not (int_fwire_IQN, int_fwire_IQ);
buf (QN, int_fwire_IQN);
// Timing
specify
(posedge CK => (Q+:((D) || (!D && int_fwire_IQ)))) = 0;
(posedge CK => (QN-:((D) || (!D && int_fwire_IQ)))) = 0;
$setuphold (posedge CK, posedge D, 0, 0, notifier,,, delayed_CK, delayed_D);
$setuphold (posedge CK, negedge D, 0, 0, notifier,,, delayed_CK, delayed_D);
$width (posedge CK &&& D, 0, 0, notifier);
$width (negedge CK &&& D, 0, 0, notifier);
endspecify
endmodule
`endcelldefine