// Automatically edited by removePhraseFromMultipleFiles.pl
// iptguser	Tue Aug 23 13:13:22 EDT 2011
// \`suppress_faults;^\n
// \`ifdef TETRAMAX;^\n
// \`ifdef functional;\`else
// \`delay_mode_path;^\n
// \`disable_portfaults;\`nosuppress_faults

// Automatically modified by replacePGwithIfDef.pl
// iptguser	Tue Aug 23 12:32:35 EDT 2011

`celldefine
`timescale 1ns / 1ps


module scs8ls_fah_2  (
output COUT,
output SUM,
input A,
input B,
input CI

`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


`ifdef functional
`else
reg csi_notifier;

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

  xor (UDP_IN_SUM,A,B,CI);
  `ifdef SC_USE_PG_PIN

  scs8ls_pg_U_VPWR_VGND (UDP_OUT_SUM, UDP_IN_SUM, vpwr, vgnd) ;
  buf  (SUM, UDP_OUT_SUM) ;

  `else
    buf ( SUM , UDP_IN_SUM ) ;
  `endif
  and (A$B,A,B),(A$CI,A,CI),(B$CI,B,CI);
  or (UDP_IN_COUT,A$B,A$CI,B$CI);
  `ifdef SC_USE_PG_PIN

  scs8ls_pg_U_VPWR_VGND (UDP_OUT_COUT, UDP_IN_COUT, vpwr, vgnd) ;
  buf  (COUT, UDP_OUT_COUT) ;


  `else
    buf  ( COUT , UDP_IN_COUT ) ;
  `endif
endmodule
`endcelldefine
