// Automatically edited by removePhraseFromMultipleFiles.pl
// iptguser	Thu Aug 25 16:08:57 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:12 EDT 2011

`celldefine


`timescale 1ns / 1ps
module scs8ms_a31oi_2  (

output Y,
input A1,
input A2,
input A3,
input B1

`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_273;

`ifdef functional
`else
reg csi_notifier;

	specify
    (A1 -=> Y) = (0:0:0,0:0:0);
    (A2 -=> Y) = (0:0:0,0:0:0);
    (A3 -=> Y) = (0:0:0,0:0:0);
    if ((!A1&!A2&!A3)) (B1 -=> Y) = (0:0:0,0:0:0);
    if ((!A1&!A2&A3)) (B1 -=> Y) = (0:0:0,0:0:0);
    if ((!A1&A2&!A3)) (B1 -=> Y) = (0:0:0,0:0:0);
    if ((!A1&A2&A3)) (B1 -=> Y) = (0:0:0,0:0:0);
    if ((A1&!A2&!A3)) (B1 -=> Y) = (0:0:0,0:0:0);
    if ((A1&!A2&A3)) (B1 -=> Y) = (0:0:0,0:0:0);
    if ((A1&A2&!A3)) (B1 -=> Y) = (0:0:0,0:0:0);
	endspecify
`endif

  and ( csi_opt_273 , A3 , A1 , A2 ) ;
  nor  ( UDP_IN_Y , B1 , csi_opt_273 ) ;
  `ifdef SC_USE_PG_PIN

  scs8ms_pg_U_VPWR_VGND (UDP_OUT_Y, UDP_IN_Y, vpwr, vgnd) ;
  buf  (Y, UDP_OUT_Y) ;
  `else
    buf ( Y , UDP_IN_Y ) ;
  `endif
endmodule
`endcelldefine
