/* -------------------------------------------------
   Mux:

     input:    n controls   (c1, c0)
               2^n data:    (d3, d2, d1, d0)

     output:   Z
   ------------------------------------------------- */

#include "Sim.h"

void MyMux( const SD &coord,
            Signal &i3, Signal &i2, Signal &i1, Signal &i0,
            Signal &c1, Signal &c0,
            Signal &out )
{
   Signal out_0, out_1, out_2, out_3, not_c0, not_c1;

   Module( coord, "MyMux", (i3,i2,i1,i0,c1,c0), out);

   Not ( SD(coord,"db"),   c0, not_c0 );
   Not ( SD(coord,"db"),   c1, not_c1 );

   And ( SD(coord,"ac"), (i0, not_c1, not_c0), out_0 );
   And ( SD(coord,"ac"), (i1, not_c1,     c0), out_1 );
   And ( SD(coord,"bc"), (i2,     c1, not_c0), out_2 );
   And ( SD(coord,"bc"), (i3,     c1,     c0), out_3 );

   Or  ( SD(coord,"ad"), (out_0, out_1, out_2, out_3), out );
}

void simnet()
{
   Sig(i0, 1);
   Sig(i1, 1);
   Sig(i2, 1);
   Sig(i3, 1);

   Sig(c0, 1);
   Sig(c1, 1);

   Sig(out, 1);   


   Switch ( "aa", i3, '3', Zero );  // Data
   Switch ( "ba", i2, '2', Zero );  // 
   Switch ( "ca", i1, '1', Zero );  // 
   Switch ( "da", i0, '0', Zero );  // 

   Switch ( "ga", c1, '7', Zero );  // 
   Switch ( "ha", c0, '8', Zero );  // Controls

   MyMux ( "cc", i3, i2, i1, i0, c1, c0, out );   // *** A lot of parameters....

   Probe( "af", out );        // Probe out
}



