// 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_sdlclkp_4  (
output GCLK,

input SCE,
input GATE,
input CLK

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

);

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

  wire m0;
  wire m0n;
  wire clkn;
  wire CLK_delayed;
  wire SCE_delayed;
  wire GATE_delayed;
  wire SCE_GATE_delayed;
  not(m0n,m0);

`ifdef functional

  not (clkn,CLK);
  nor (SCE_GATE,GATE,SCE);
`ifdef SC_USE_PG_PIN
 scs8lpa_U_DL_P_NO_pg #0.001 ( m0 , SCE_GATE , clkn ,  , vpwr , vgnd ) ;
`else
 scs8lpa_U_DL_P #0.001 ( m0 , SCE_GATE , clkn ) ;
`endif
  and (GCLK, m0n, CLK);
`else
  reg notifier;
  not (clkn,CLK_delayed);
  nor (SCE_GATE_delayed,GATE_delayed,SCE_delayed);
scs8lpa_U_DL_P_NO_pg  ( m0 , SCE_GATE_delayed , clkn , notifier , vpwr , vgnd ) ;
  and (GCLK, m0n, CLK_delayed);

  specify
    (CLK +=> GCLK) = (0:0:0,0:0:0);                         // delays are tris,tfall
    $width (posedge CLK , 0:0:0, 0, notifier);
    $width (negedge CLK , 0:0:0, 0, notifier);
    $setuphold ( posedge CLK , posedge SCE , 0:0:0, 0:0:0, notifier , , , CLK_delayed , SCE_delayed ) ;
    $setuphold ( posedge CLK , negedge SCE , 0:0:0, 0:0:0, notifier , , , CLK_delayed , SCE_delayed ) ;
    $setuphold ( posedge CLK , posedge GATE , 0:0:0, 0:0:0, notifier , , , CLK_delayed , GATE_delayed ) ;
    $setuphold ( posedge CLK , negedge GATE , 0:0:0, 0:0:0, notifier , , , CLK_delayed , GATE_delayed ) ;
  endspecify
`endif


endmodule
`endcelldefine
