| // type: DFFS |
| `timescale 1ns/10ps |
| `celldefine |
| module DFFSXL (Q, QN, D, SN, CK); |
| output Q, QN; |
| input D, SN, CK; |
| reg notifier; |
| wire delayed_D, delayed_CK; |
| |
| // Function |
| wire int_fwire_IQ, int_fwire_IQN, int_fwire_s; |
| wire xcr_0; |
| |
| not (int_fwire_s, SN); |
| altos_dff_s_err (xcr_0, delayed_CK, delayed_D, int_fwire_s); |
| altos_dff_s (int_fwire_IQ, notifier, delayed_CK, delayed_D, int_fwire_s, xcr_0); |
| buf (Q, int_fwire_IQ); |
| not (int_fwire_IQN, int_fwire_IQ); |
| buf (QN, int_fwire_IQN); |
| |
| // Timing |
| |
| // Additional timing wires |
| wire adacond0, adacond1, D__bar; |
| |
| |
| // Additional timing gates |
| and (adacond0, D, SN); |
| not (D__bar, D); |
| and (adacond1, D__bar, SN); |
| |
| specify |
| if (CK) |
| (negedge SN => (Q+:1'b1)) = 0; |
| if ((~CK & D)) |
| (negedge SN => (Q+:1'b1)) = 0; |
| if ((~CK & ~D)) |
| (negedge SN => (Q+:1'b1)) = 0; |
| ifnone (negedge SN => (Q+:1'b1)) = 0; |
| (posedge CK => (Q+:D)) = 0; |
| if (CK) |
| (negedge SN => (QN-:1'b1)) = 0; |
| if ((~CK & D)) |
| (negedge SN => (QN-:1'b1)) = 0; |
| if ((~CK & ~D)) |
| (negedge SN => (QN-:1'b1)) = 0; |
| ifnone (negedge SN => (QN-:1'b1)) = 0; |
| (posedge CK => (QN-:D)) = 0; |
| $setuphold (posedge CK &&& SN, posedge D &&& SN, 0, 0, notifier,,, delayed_CK, delayed_D); |
| $setuphold (posedge CK &&& SN, negedge D &&& SN, 0, 0, notifier,,, delayed_CK, delayed_D); |
| $setuphold (posedge CK, posedge D, 0, 0, notifier,,, delayed_CK, delayed_D); |
| $setuphold (posedge CK, negedge D, 0, 0, notifier,,, delayed_CK, delayed_D); |
| $recovery (posedge SN &&& ~D, posedge CK &&& ~D, 0, notifier); |
| $recovery (posedge SN, posedge CK, 0, notifier); |
| $hold (posedge CK &&& ~D, posedge SN &&& ~D, 0, notifier); |
| $hold (posedge CK, posedge SN, 0, notifier); |
| $width (negedge SN &&& CK, 0, 0, notifier); |
| $width (negedge SN &&& ~CK, 0, 0, notifier); |
| $width (posedge CK &&& adacond0, 0, 0, notifier); |
| $width (negedge CK &&& adacond0, 0, 0, notifier); |
| $width (posedge CK &&& adacond1, 0, 0, notifier); |
| $width (negedge CK &&& adacond1, 0, 0, notifier); |
| endspecify |
| endmodule |
| `endcelldefine |
| |