import jazz.circuit.*; import jazz.circuit.Net.*; import jazz.circuit.blues.*; // programme principal device MICRO { public output seg1:Net[7], seg2:Net[7], seg3:Net[7], seg4:Net[7], seg5:Net[7], seg6:Net[7]; // Programmes limités à 1024 mots rom=new ROM(naddr=10,ndata=16,content="prog_ass.dat",addr=rom_adr); alu=new ALU(entree0=e0,entree1=e1,codop=code_operation,codeshift=code_shft,coderetenue=code_ret,write_ovfl_egal=decodeur.write_ovfl_egal); registres=new REGISTRES(nomreg0=nom_reg0,nomreg1=nom_reg1,nomreg2=nom_reg2,controle_overflow=ctrl_ovf,controle_egalite=ctrl_eg,controle_abs_activation_RI=caar,overflow0=ovf,egalite=eg,donnees=donnee,freeze=freez,top=topp,test_ecriture_reg=test_ecr_reg); ram=new RAM(naddr=16,ndata=16,read_addr=e0,write_addr=e0,write_enable=ecrit_ram,data_in=e1); decio=new DEC_IO(top=topp,donnees_O=e0,controle_IO=ctrl_IO,choix_IO=chx_IO); decodeur=new DECODEUR(instruction=instr); topp=constant(#(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)); instr=rom.data; ecrit_ram=decodeur.write_mem; rom_adr=registres.ri; e0=registres.reg1_vers; e1=registres.reg2_vers; code_operation=decodeur.codop_alu; code_shft=decodeur.codeshift; code_ret=decodeur.coderetenue; donnee=mux_mult(2)([decodeur.in_cste,decodeur.cste_RAM],[mux_mult(1)([decodeur.test_mov1_alu0],[alu.sortie,e1]),decio.donnees_I,ram.data_out,decodeur.constante]); nom_reg0=decodeur.reg_ecriture; nom_reg1=decodeur.reg_lecture1; nom_reg2=decodeur.reg_lecture2; caar=decodeur.cond_tout; ctrl_ovf=decodeur.cond_overfl; ctrl_eg=decodeur.cond_egal; ovf=alu.overflow; eg=alu.egalite; freez=decodeur.freeze; test_ecr_reg=decodeur.write_reg; ctrl_IO=decodeur.write_io; chx_IO=decodeur.indiceio; seg6=decode7segs(decio.sortie6); seg1=decode7segs(decio.sortie1); seg2=decode7segs(decio.sortie2); seg3=decode7segs(decio.sortie3); seg4=decode7segs(decio.sortie4); seg5=decode7segs(decio.sortie5); }; export MICRO(); 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]); }; }; } ; fun decode7segs(b:Net[4]) = s:Net[7] { // Shared expressions, over 1 bit input b[0] z = constant(0); // (0) u = constant(-1); // (1) n = ~ b[0]; // 10 = ~ b[0] // Shared expressions, over 2 bits input b[0..1] d1 = mux(b[1],z,n); // 1000 = ~(b[0] | b[1]) d2 = mux(b[1],n,u); // 1110 = ~(b[0] & b[1]) d3 = mux(b[1],n,z); // 0010 = ~ b[0] & b[1] d4 = mux(b[1],u,n); // 1011 = ~ b[0] | b[1] d5 = mux(b[1],n,b[0]); // 0110 = b[0] ^ b[1] d6 = mux(b[1],b[0],u); // 1101 = ~ b[1] | b[0] d7 = mux(b[1],b[0],n); // 1001 = ~(b[0] ^ b[1]) d8 = mux(b[1],u,b[0]); // 0111 = b[0] | b[1] // Shared expressions, over 3 bits input b[0..2] t1 = mux(b[2],d2,d1); // 1000 1110 t2 = mux(b[2],d2,b[1]); // 0011 1110 t3 = mux(b[2],d5,d4); // 1011 0110 t4 = mux(b[2],u,d6); // 1101 1111 t5 = mux(b[2],d7,u); // 1111 1001 t6 = mux(b[2],d8,d4); // 1011 0111 t7 = mux(b[2],d3,n); // 1010 0010 // 7 segments output from decoder, with truth tables s[0] = mux(b[3],u,t1); // 10001110 11111111 s[1] = mux(b[3],u,t2); // 00111110 11111111 s[2] = t7; // 10100010 10100010 s[3] = mux(b[3],u,t3); // 10110110 11111111 s[4] = mux(b[3],u,t4); // 11011111 11111111 s[5] = mux(b[3],u,t5); // 11111001 11111111 s[6] = mux(b[3],u,t6); // 10110111 11111111 };