// Automatically modified by replacePGwithIfDef.pl
// iptguser	Thu Aug 18 13:10:23 EDT 2011

// Automatically edited by removePhraseFromMultipleFiles.pl
// iptguser	Mon Aug  8 14:40:05 EDT 2011
// \`suppress_faults;^\n
// \`ifdef TETRAMAX;^\n
// \`ifdef functional;\`else
// \`delay_mode_path;^\n
// \`disable_portfaults;\`nosuppress_faults

`celldefine
`timescale 1ns / 1ps

module scs8lp_srdlxtp_1  (
output Q,
input D,
input GATE,
input SLEEPB

`ifdef SC_USE_PG_PIN
, input kapwr
, input vpwr
, input vgnd
, input vpb
, input vnb
`endif

);

`ifdef functional
`else
`ifdef SC_USE_PG_PIN
`else
supply1 kapwr;
supply1 vpwr;
supply0 vgnd;
supply1 vpb;
supply0 vnb;
`endif
`endif



  wire buf_Q;
  wire GATE_delayed;
  wire D_delayed;

`ifdef functional
  scs8lpa_U_DL_P_SLEEPB_pg #0.001 ( buf_Q , D , GATE , SLEEPB , kapwr , vgnd , vpwr) ;
`else
    reg notifier;
  scs8lpa_U_DL_P_NO_SLEEPB_pg ( buf_Q , D_delayed , GATE_delayed , SLEEPB , notifier , kapwr , vgnd , vpwr ) ;
`endif

`ifdef functional
`else
  wire AWAKE;
  assign AWAKE = (SLEEPB === 1'b1);
	specify
		(D +=> Q ) = (0:0:0,0:0:0);  // delays are tris,tfall
    
		(posedge GATE => (Q +: D ) ) = (0:0:0,0:0:0); // delays are tris,tfall
    
		$width (posedge GATE &&& AWAKE , 1.0:1.0:1.0, 0, notifier);
		$width (negedge GATE &&& AWAKE , 1.0:1.0:1.0, 0, notifier);
    
    $setuphold ( negedge GATE , posedge D , 0:0:0, 0:0:0, notifier , AWAKE , AWAKE , GATE_delayed , D_delayed ) ;
    $setuphold ( negedge GATE , negedge D , 0:0:0, 0:0:0, notifier , AWAKE , AWAKE , GATE_delayed , D_delayed ) ;
	endspecify
`endif

  bufif1 ( Q , buf_Q , vpwr );

endmodule
`endcelldefine
