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

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

     ****** Inputs separated into 2 arrays ********

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

#include "Sim.h"

void MyMux( const SD &coord,
            const Signal &i, 
	    const Signal &c,    // Interpret i, c as arrays !!!
            const Signal &out )
{
   Signal out_0, out_1, out_2, out_3, not_c0, not_c1;

   Module( coord, "MyMux", (i,c), out);

   Not ( SD(coord,"db"),   c[0], not_c0 );
   Not ( SD(coord,"db"),   c[1], not_c1 );

   And ( SD(coord,"ac"), (i[0], not_c1, not_c0), out_0 );
   And ( SD(coord,"ac"), (i[1], not_c1,   c[0]), out_1 );
   And ( SD(coord,"bc"), (i[2],   c[1], not_c0), out_2 );
   And ( SD(coord,"bc"), (i[3],   c[1],   c[0]), out_3 );

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

void simnet()
{
   Sig(i, 4);   // i is an array: i[3] .. i[0]
   Sig(c, 2);   // c is an array: c[1] .. c[0]

   Sig(out, 1);   


   Switch ( "aa", i[3], '3', Zero );  // Data
   Switch ( "ba", i[2], '2', Zero );  // 
   Switch ( "ca", i[1], '1', Zero );  // 
   Switch ( "da", i[0], '0', Zero );  // 

   Switch ( "ga", c[1], '7', Zero );  // 
   Switch ( "ha", c[0], '8', Zero );  // Controls

   MyMux ( "cc", (i[3],i[2],i[1],i[0]), (c[1],c[0]), out ); 
                 // Pass 2 arrays !!!

// Or: 
// MyMux ( "cc", (i[3]-i[0]), (c[1]-c[0]), out );

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



