// Automatically edited by removePhraseFromMultipleFiles.pl
// iptguser	Thu Aug 25 16:08:58 EDT 2011
// `suppress_faults;`enable_portfaults\n
// `ifdef TETRAMAX;`endif\n
// `ifdef functional;`timescale
// `ifndef dont_change_delay_mode;`endif\n
// `ifndef dont_change_delay_mode;`else\n
// `ifndef dont_change_delay_mode;`endif\n
// `endif;\n
// `disable_portfaults;`nosuppress_faults

// Automatically modified by replacePGwithIfDef.pl
// iptguser	Thu Aug 25 14:39:13 EDT 2011

`celldefine


`timescale 1ns / 1ps
module scs8ms_o2bb2a_2  (

output X,
input A1N,
input A2N,
input B1,
input B2

`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_296;
  wire csi_opt_294;

`ifdef functional
`else
reg csi_notifier;

	specify
    if ((A2N&!B1&B2)) (A1N -=> X) = (0:0:0,0:0:0);
    if ((A2N&B1&!B2)) (A1N -=> X) = (0:0:0,0:0:0);
    if ((A2N&B1&B2)) (A1N -=> X) = (0:0:0,0:0:0);
    if ((A1N&!B1&B2)) (A2N -=> X) = (0:0:0,0:0:0);
    if ((A1N&B1&!B2)) (A2N -=> X) = (0:0:0,0:0:0);
    if ((A1N&B1&B2)) (A2N -=> X) = (0:0:0,0:0:0);
    if ((!A1N&!A2N&!B2)) (B1 +=> X) = (0:0:0,0:0:0);
    if ((!A1N&A2N&!B2)) (B1 +=> X) = (0:0:0,0:0:0);
    if ((A1N&!A2N&!B2)) (B1 +=> X) = (0:0:0,0:0:0);
    if ((!A1N&!A2N&!B1)) (B2 +=> X) = (0:0:0,0:0:0);
    if ((!A1N&A2N&!B1)) (B2 +=> X) = (0:0:0,0:0:0);
    if ((A1N&!A2N&!B1)) (B2 +=> X) = (0:0:0,0:0:0);
	endspecify
`endif

  nand ( csi_opt_296 , A2N , A1N ) ;
  or ( csi_opt_294 , B2 , B1 ) ;
  and  ( UDP_IN_X , csi_opt_296 , csi_opt_294 ) ;
  `ifdef SC_USE_PG_PIN

  scs8ms_pg_U_VPWR_VGND (UDP_OUT_X, UDP_IN_X, vpwr, vgnd) ;
  buf  (X, UDP_OUT_X) ;
  `else
    buf ( X , UDP_IN_X ) ;
  `endif
endmodule
`endcelldefine
