// definition des registres, R1 a R14, RP, et enfin RI // registres 1 à 14 et de RP import jazz.circuit.*; import jazz.circuit.Net.*; import jazz.circuit.blues.*; fun Registre_normal ( e : Net[16], a : Net) = (s:Net[16]) { for (k<16) { s[k] = enable ( reg (e[k]) , a); } }; 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 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]); }; }; } ; // device registres device REGISTRES { public input nomreg0 : Net[4], nomreg1 : Net[4], nomreg2 : Net[4], controle_overflow : Net, controle_egalite : Net, controle_abs_activation_RI : Net, overflow0 : Net, egalite : Net, donnees : Net[16], freeze : Net, top : Net, test_ecriture_reg : Net; public output ri:Net[16], reg1_vers : Net[16], reg2_vers : Net[16]; overflow=overflow0; a= activ_reg (4) (nomreg0,test_ecriture_reg); r1 = Registre_normal (donnees , a[0]); r2 = Registre_normal (donnees , a[1]); r3 = Registre_normal (donnees , a[2]); r4 = Registre_normal (donnees , a[3]); r5 = Registre_normal (donnees , a[4]); r6 = Registre_normal (donnees , a[5]); r7 = Registre_normal (donnees , a[6]); r8 = Registre_normal (donnees , a[7]); r9 = Registre_normal (donnees , a[8]); r10 = Registre_normal (donnees , a[9]); r11 = Registre_normal (donnees , a[10]); r12 = Registre_normal (donnees , a[11]); r13 = Registre_normal (donnees , a[12]); r14 = Registre_normal (donnees , a[13]); rp = Registre_normal (donnees, a[14]); t=[r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, rp, ri]; reg1_vers=mux_mult (4) (nomreg1, t); reg2_vers=mux_mult (4) (nomreg2, t); r=(mux_mult(1)([(controle_abs_activation_RI|(controle_overflow&controle_egalite&egalite&overflow)|(controle_egalite&~controle_overflow&egalite)|(~controle_egalite&controle_overflow&overflow)|(~controle_egalite&~controle_overflow&(egalite|overflow)))&(a[15]|~controle_abs_activation_RI)],[mux_mult(1)([freeze&~top],[Incr(16)(ri),ri]),donnees])); for (k<16) ri[k]=reg(r[k]); }; export REGISTRES(); 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]]; };