Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.39 KB | None | 0 0
  1. /**
  2.  *
  3.  */
  4. package net.ttlhacker.quarterv.sim.cpu;
  5.  
  6. import net.ttlhacker.libttlsim.model.InputPort;
  7. import net.ttlhacker.libttlsim.model.OutputPort;
  8. import net.ttlhacker.libttlsim.model.Simulation;
  9. import net.ttlhacker.libttlsim.model.chips.Series;
  10. import net.ttlhacker.libttlsim.model.chips.StrobedMultiplexerChip;
  11. import net.ttlhacker.libttlsim.model.chips.TristateBusDriver244;
  12. import net.ttlhacker.libttlsim.model.devices.Buffer;
  13. import net.ttlhacker.libttlsim.model.devices.Constant;
  14. import net.ttlhacker.libttlsim.model.devices.TristateBus;
  15.  
  16. import static net.ttlhacker.libttlsim.model.OutputPort.concat;
  17. import static net.ttlhacker.libttlsim.model.chips.SimpleCombinatorialChip.*;
  18.  
  19. /**
  20.  * Extracts the immediate field from an instruction.
  21.  *
  22.  * @author jonathan
  23.  *
  24.  */
  25. public class ImmediateExtractor {
  26.    
  27.     public final InputPort instructionInput;
  28.     public final OutputPort immediateOutput;
  29.    
  30.     public ImmediateExtractor(Simulation sim, Series nor260Series, Series standardGateSeries, Series muxSeries, Series busDriverSeries) {
  31.         Buffer insnBuffer = new Buffer(sim, 32);
  32.         OutputPort insn = insnBuffer.output;
  33.         this.instructionInput = insnBuffer.input;
  34.        
  35.         //This decoder provides the immediate encoding type as a one-hot signal.
  36.         ImmediateTypeDecoder typeDecoder = new ImmediateTypeDecoder(sim, standardGateSeries, nor260Series);
  37.         OutputPort i = typeDecoder.i, s = typeDecoder.s, b = typeDecoder.b, u = typeDecoder.u, j = typeDecoder.j;
  38.         typeDecoder.instructionIn.connectTo(insn);
  39.        
  40.         //Needed bit combinations from the instruction.
  41.         OutputPort signBit = insn.bit(31);
  42.         OutputPort insn20 = insn.bit(20);
  43.         OutputPort insn7 = insn.bit(7);
  44.        
  45.         //A zero bit.
  46.         Constant constZero = new Constant(sim, 1, 0);
  47.         OutputPort zeroBit = constZero.output;
  48.        
  49.         //Compute bits 0 and 11 of the immediate using a '153 mux.
  50.         var muxSelISBJ = OR_2INP_74XX32.create(sim, standardGateSeries, 2);
  51.         muxSelISBJ.inputs[0].connectTo(concat(s, b));
  52.         muxSelISBJ.inputs[1].connectTo(concat(j, j));
  53.         var muxFor0And11 = StrobedMultiplexerChip.MUX_4INP_2WIDE_74XX153.create(sim, muxSeries);
  54.         muxFor0And11.selectInput.connectTo(muxSelISBJ.output);
  55.         muxFor0And11.dataInputs[0].connectTo(concat(insn20, signBit));      //I
  56.         muxFor0And11.dataInputs[1].connectTo(concat(insn7, signBit));       //S
  57.         muxFor0And11.dataInputs[2].connectTo(concat(zeroBit, insn7));       //B
  58.         muxFor0And11.dataInputs[3].connectTo(concat(zeroBit, insn20));      //J
  59.         muxFor0And11.strobe.connectTo(u.signExtend(2));                     //Both bits are 0 for U immediates.
  60.         OutputPort imm0 = muxFor0And11.output.bit(0);
  61.         OutputPort imm11 = muxFor0And11.output.bit(1);
  62.        
  63.         //Compute bits 1 to 4 of the immediate with a '157 mux.
  64.         var muxSelBits1To4 = OR_2INP_74XX32.create(sim, standardGateSeries, 1);
  65.         muxSelBits1To4.inputs[0].connectTo(i);
  66.         muxSelBits1To4.inputs[0].connectTo(j);
  67.         var muxFor1To4 = StrobedMultiplexerChip.MUX_2INP_4WIDE_74XX157.create(sim, muxSeries);
  68.         muxFor1To4.selectInput.connectTo(muxSelBits1To4.output);
  69.         muxFor1To4.dataInputs[0].connectTo(insn.subset(8, 4)); //S and B: insn[8..11]
  70.         muxFor1To4.dataInputs[1].connectTo(insn.subset(21, 4)); //I and J: insn[21..24]
  71.         muxFor1To4.strobe.connectTo(u); //Bits 1..4 are zero for U immediates.
  72.         OutputPort imm1To4 = muxFor1To4.output;
  73.        
  74.         //Bits 5 to 10 are zero for U immediates and equal to insn[25..30] otherwise.
  75.         var uInverter = INV_74XX04.create(sim, standardGateSeries, 1);
  76.         uInverter.inputs[0].connectTo(u);
  77.         OutputPort notU = uInverter.output;
  78.         var imm5To10And = AND_2INP_74XX08.create(sim, standardGateSeries, 6);
  79.         imm5To10And.inputs[0].connectTo(notU.signExtend(6));
  80.         imm5To10And.inputs[1].connectTo(insn.subset(25, 6));
  81.         OutputPort imm5To10 = imm5To10And.output;
  82.        
  83.         //Bits 12 to 19 are equal to the sign bit, except for U/J, where they're equal to insn[12..19].
  84.         var uOrJGate = OR_2INP_74XX32.create(sim, standardGateSeries, 1);
  85.         uOrJGate.inputs[0].connectTo(u);
  86.         uOrJGate.inputs[1].connectTo(j);
  87.         var notUOrJGate = INV_74XX04.create(sim, standardGateSeries, 1);
  88.         notUOrJGate.inputs[0].connectTo(uOrJGate.output);
  89.         TristateBus bit12To19Bus = new TristateBus(sim, 8);
  90.         var bit12To19SignDriver = new TristateBusDriver244(sim, bit12To19Bus, busDriverSeries);
  91.         var bit12To19ImmDriver = new TristateBusDriver244(sim, bit12To19Bus, busDriverSeries);
  92.         bit12To19SignDriver.dataIn.connectTo(signBit.signExtend(8));
  93.         bit12To19SignDriver.nOE.connectTo(uOrJGate.output); //Sign bit for anything but U/J
  94.         bit12To19ImmDriver.dataIn.connectTo(insn.subset(12, 8));
  95.         bit12To19ImmDriver.nOE.connectTo(notUOrJGate.output); //Immediate bits for U/J
  96.         OutputPort imm12To19 = bit12To19Bus.output;
  97.        
  98.         //Bits 20 to 30 are equal to the sign bit, except for U, where they're equal to insn[20..30].
  99.         TristateBus bit20To30Bus = new TristateBus(sim, 11);
  100.         var bit20To30SignDriver = new TristateBusDriver244(sim, bit20To30Bus, busDriverSeries);
  101.         var bit20To30ImmDriver = new TristateBusDriver244(sim, bit20To30Bus, busDriverSeries);
  102.         bit20To30SignDriver.dataIn.connectTo(signBit.signExtend(11));
  103.         bit20To30SignDriver.nOE.connectTo(u); //Sign bit for anything but U
  104.         bit20To30ImmDriver.dataIn.connectTo(insn.subset(20, 11));
  105.         bit20To30ImmDriver.nOE.connectTo(notU); //Immediate bits for U
  106.         OutputPort imm20To30 = bit20To30Bus.output;
  107.        
  108.         //Assemble the final immediate value
  109.         this.immediateOutput = concat(imm0, imm1To4, imm5To10, imm11, imm12To19, imm20To30, signBit);
  110.     }
  111.    
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement