blob: 45f99959901ae3d0d799f11455401e5bdc3328c9 [file] [log] [blame]
// 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