// 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_ha_lp  (
output COUT,
output SUM,

input A,
input B

`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



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

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

  and  ( UDP_IN_COUT , A , B ) ;
  `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

  xor  ( UDP_IN_SUM , B , A ) ;
  `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
