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

// Automatically edited by removePhraseFromMultipleFiles.pl
// iptguser	Mon Aug  8 14:40:00 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_fa_4  (
output COUT,
output SUM,

input A,
input B,
input CIN

`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 csi_opt_303;
  wire csi_opt_278;
  wire csi_opt_279;
  wire csi_opt_276;
  wire csi_opt_275;
  wire csi_opt_277;

// modification by BNB, based on SPR13943.  need to have
`ifdef functional
`else
reg csi_notifier;

	specify
    if ((!B&CIN)) (A +=> COUT) = (0:0:0,0:0:0);
    if ((B&!CIN)) (A +=> COUT) = (0:0:0,0:0:0);
    if ((!A&CIN)) (B +=> COUT) = (0:0:0,0:0:0);
    if ((A&!CIN)) (B +=> COUT) = (0:0:0,0:0:0);
    if ((!A&B)) (CIN +=> COUT) = (0:0:0,0:0:0);
    if ((A&!B)) (CIN +=> COUT) = (0:0:0,0:0:0);
    if ((!B&!CIN)) (A +=> SUM) = (0:0:0,0:0:0);
    if ((!B&CIN)) (A -=> SUM) = (0:0:0,0:0:0);
    if ((B&!CIN)) (A -=> SUM) = (0:0:0,0:0:0);
    if ((B&CIN)) (A +=> SUM) = (0:0:0,0:0:0);
    if ((!A&!CIN)) (B +=> SUM) = (0:0:0,0:0:0);
    if ((!A&CIN)) (B -=> SUM) = (0:0:0,0:0:0);
    if ((A&!CIN)) (B -=> SUM) = (0:0:0,0:0:0);
    if ((A&CIN)) (B +=> SUM) = (0:0:0,0:0:0);
    if ((!A&!B)) (CIN +=> SUM) = (0:0:0,0:0:0);
    if ((!A&B)) (CIN -=> SUM) = (0:0:0,0:0:0);
    if ((A&!B)) (CIN -=> SUM) = (0:0:0,0:0:0);
    if ((A&B)) (CIN +=> SUM) = (0:0:0,0:0:0);
	endspecify
`endif

  or ( csi_opt_303 , CIN , B ) ;
  and ( csi_opt_278 , csi_opt_303 , A ) ;
  and ( csi_opt_279 , B , CIN ) ;
  or  ( UDP_IN_COUT , csi_opt_279 , csi_opt_278 ) ;
  `ifdef SC_USE_PG_PIN

  scs8lpa_U_VPWR_VGND (UDP_OUT_COUT, UDP_IN_COUT, vpwr, vgnd) ;
  buf   (COUT, UDP_OUT_COUT) ;
  `else
    buf ( COUT , UDP_IN_COUT ) ;
  `endif
  and ( csi_opt_276 , CIN , A , B ) ;
  nor ( csi_opt_275 , A , csi_opt_303 ) ;
  nor ( csi_opt_277 , csi_opt_275 , COUT ) ;
  or  ( UDP_IN_SUM , csi_opt_277 , csi_opt_276 ) ;
  `ifdef SC_USE_PG_PIN

  scs8lpa_U_VPWR_VGND (UDP_OUT_SUM, UDP_IN_SUM, vpwr, vgnd) ;
  buf   (SUM, UDP_OUT_SUM) ;
  `else
  buf (SUM, UDP_IN_SUM) ;
  `endif
endmodule
`endcelldefine
