import jazz.circuit.*; import jazz.circuit.Net.*; import jazz.circuit.blues.*; device DEC_IO{ public input top:Net, donnees_O:Net[16], controle_IO:Net, choix_IO:Net[4]; public output donnees_I:Net[16], sortie0:Net[16], sortie1:Net[16], sortie2:Net[16], sortie3:Net[16], sortie4:Net[16], sortie5:Net[16], sortie6:Net[16], sortie7:Net[16], sortie8:Net[16], sortie9:Net[16], sortie10:Net[16], sortie11:Net[16], sortie12:Net[16], sortie13:Net[16], sortie14:Net[16], sortie15:Net[16]; N=10; entree0=new ROM(naddr=N,ndata=16,content="input0.dat",addr=rom_adr); entree1=new ROM(naddr=N,ndata=16,content="input1.dat",addr=rom_adr); entree2=new ROM(naddr=N,ndata=16,content="input2.dat",addr=rom_adr); entree3=new ROM(naddr=N,ndata=16,content="input3.dat",addr=rom_adr); entree4=new ROM(naddr=N,ndata=16,content="input4.dat",addr=rom_adr); entree5=new ROM(naddr=N,ndata=16,content="input5.dat",addr=rom_adr); entree6=new ROM(naddr=N,ndata=16,content="input6.dat",addr=rom_adr); entree7=new ROM(naddr=N,ndata=16,content="input7.dat",addr=rom_adr); entree8=new ROM(naddr=N,ndata=16,content="input8.dat",addr=rom_adr); entree9=new ROM(naddr=N,ndata=16,content="input9.dat",addr=rom_adr); entree10=new ROM(naddr=N,ndata=16,content="input10.dat",addr=rom_adr); entree11=new ROM(naddr=N,ndata=16,content="input11.dat",addr=rom_adr); entree12=new ROM(naddr=N,ndata=16,content="input12.dat",addr=rom_adr); entree13=new ROM(naddr=N,ndata=16,content="input13.dat",addr=rom_adr); entree14=new ROM(naddr=N,ndata=16,content="input14.dat",addr=rom_adr); entree15=new ROM(naddr=N,ndata=16,content="input15.dat",addr=rom_adr); a= activ_reg (4) (choix_IO, controle_IO); sortie0 = Registre_normal (donnees_O , a[0]); sortie1 = Registre_normal (donnees_O , a[1]); sortie2 = Registre_normal (donnees_O , a[2]); sortie3 = Registre_normal (donnees_O , a[3]); sortie4 = Registre_normal (donnees_O , a[4]); sortie5 = Registre_normal (donnees_O , a[5]); sortie6 = Registre_normal (donnees_O , a[6]); sortie7 = Registre_normal (donnees_O , a[7]); sortie8 = Registre_normal (donnees_O , a[8]); sortie9 = Registre_normal (donnees_O , a[9]); sortie10 = Registre_normal (donnees_O , a[10]); sortie11 = Registre_normal (donnees_O , a[11]); sortie12 = Registre_normal (donnees_O , a[12]); sortie13 = Registre_normal (donnees_O , a[13]); sortie14 = Registre_normal (donnees_O , a[14]); sortie15 = Registre_normal (donnees_O , a[15]); donnees_I=mux_mult(4)(choix_IO,[entree0.data,entree1.data,entree2.data,entree3.data,entree4.data,entree5.data,entree6.data,entree7.data,entree8.data,entree9.data,entree10.data,entree11.data,entree12.data,entree13.data,entree14.data,entree15.data]); rom_adr=Registre_normal(Incr(N)(rom_adr),top); }; export DEC_IO(); fun activ_reg (n : int) (e : Net[n] ,entree : Net) = ( s : Net[2**n]) { if (n==1) { s[0]=(~e[0])&entree; s[1]=e[0]&entree; } else { s[0..(2**(n-1)-1)]=activ_reg(n-1) (e[0..(n-2)] , (~e[n-1])&entree); s[2**(n-1)..((2**n)-1)]=activ_reg(n-1) (e[0..(n-2)] , e[n-1]&entree); } }; fun Registre_normal ( e : Net[16], a : Net) = (s:Net[16]) { for (k<16) { s[k] = enable ( reg (e[k]) , a); } }; fun Incr (N:int)(e:Net[N])=(s:Net[N]) { i=[constant(-1),n->i[n-1]&e[n-1]]; s=[n->e[n]^i[n]]; }; fun mux_mult (n : int) (cond : Net[n], donnees : Net[16][2**n]) = (s : Net[16]) { if (n==1) { for (k<16) { s[k]= mux ( cond[0], donnees[1][k],donnees[0][k]); }; } else { a= mux_mult (n-1) (cond[0..(n-2)] , donnees[0..((2**(n-1))-1)]); b= mux_mult (n-1) (cond[0..(n-2)] , donnees[(2**(n-1))..((2**n)-1)]); for (k<16){ s[k]= mux (cond[n-1], b[k], a[k]); }; }; } ;