Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- *
- */
- package net.ttlhacker.quarterv.sim.cpu;
- import net.ttlhacker.libttlsim.model.InputPort;
- import net.ttlhacker.libttlsim.model.OutputPort;
- import net.ttlhacker.libttlsim.model.Simulation;
- import net.ttlhacker.libttlsim.model.chips.Series;
- import net.ttlhacker.libttlsim.model.chips.StrobedMultiplexerChip;
- import net.ttlhacker.libttlsim.model.chips.TristateBusDriver244;
- import net.ttlhacker.libttlsim.model.devices.Buffer;
- import net.ttlhacker.libttlsim.model.devices.Constant;
- import net.ttlhacker.libttlsim.model.devices.TristateBus;
- import static net.ttlhacker.libttlsim.model.OutputPort.concat;
- import static net.ttlhacker.libttlsim.model.chips.SimpleCombinatorialChip.*;
- /**
- * Extracts the immediate field from an instruction.
- *
- * @author jonathan
- *
- */
- public class ImmediateExtractor {
- public final InputPort instructionInput;
- public final OutputPort immediateOutput;
- public ImmediateExtractor(Simulation sim, Series nor260Series, Series standardGateSeries, Series muxSeries, Series busDriverSeries) {
- Buffer insnBuffer = new Buffer(sim, 32);
- OutputPort insn = insnBuffer.output;
- this.instructionInput = insnBuffer.input;
- //This decoder provides the immediate encoding type as a one-hot signal.
- ImmediateTypeDecoder typeDecoder = new ImmediateTypeDecoder(sim, standardGateSeries, nor260Series);
- OutputPort i = typeDecoder.i, s = typeDecoder.s, b = typeDecoder.b, u = typeDecoder.u, j = typeDecoder.j;
- typeDecoder.instructionIn.connectTo(insn);
- //Needed bit combinations from the instruction.
- OutputPort signBit = insn.bit(31);
- OutputPort insn20 = insn.bit(20);
- OutputPort insn7 = insn.bit(7);
- //A zero bit.
- Constant constZero = new Constant(sim, 1, 0);
- OutputPort zeroBit = constZero.output;
- //Compute bits 0 and 11 of the immediate using a '153 mux.
- var muxSelISBJ = OR_2INP_74XX32.create(sim, standardGateSeries, 2);
- muxSelISBJ.inputs[0].connectTo(concat(s, b));
- muxSelISBJ.inputs[1].connectTo(concat(j, j));
- var muxFor0And11 = StrobedMultiplexerChip.MUX_4INP_2WIDE_74XX153.create(sim, muxSeries);
- muxFor0And11.selectInput.connectTo(muxSelISBJ.output);
- muxFor0And11.dataInputs[0].connectTo(concat(insn20, signBit)); //I
- muxFor0And11.dataInputs[1].connectTo(concat(insn7, signBit)); //S
- muxFor0And11.dataInputs[2].connectTo(concat(zeroBit, insn7)); //B
- muxFor0And11.dataInputs[3].connectTo(concat(zeroBit, insn20)); //J
- muxFor0And11.strobe.connectTo(u.signExtend(2)); //Both bits are 0 for U immediates.
- OutputPort imm0 = muxFor0And11.output.bit(0);
- OutputPort imm11 = muxFor0And11.output.bit(1);
- //Compute bits 1 to 4 of the immediate with a '157 mux.
- var muxSelBits1To4 = OR_2INP_74XX32.create(sim, standardGateSeries, 1);
- muxSelBits1To4.inputs[0].connectTo(i);
- muxSelBits1To4.inputs[0].connectTo(j);
- var muxFor1To4 = StrobedMultiplexerChip.MUX_2INP_4WIDE_74XX157.create(sim, muxSeries);
- muxFor1To4.selectInput.connectTo(muxSelBits1To4.output);
- muxFor1To4.dataInputs[0].connectTo(insn.subset(8, 4)); //S and B: insn[8..11]
- muxFor1To4.dataInputs[1].connectTo(insn.subset(21, 4)); //I and J: insn[21..24]
- muxFor1To4.strobe.connectTo(u); //Bits 1..4 are zero for U immediates.
- OutputPort imm1To4 = muxFor1To4.output;
- //Bits 5 to 10 are zero for U immediates and equal to insn[25..30] otherwise.
- var uInverter = INV_74XX04.create(sim, standardGateSeries, 1);
- uInverter.inputs[0].connectTo(u);
- OutputPort notU = uInverter.output;
- var imm5To10And = AND_2INP_74XX08.create(sim, standardGateSeries, 6);
- imm5To10And.inputs[0].connectTo(notU.signExtend(6));
- imm5To10And.inputs[1].connectTo(insn.subset(25, 6));
- OutputPort imm5To10 = imm5To10And.output;
- //Bits 12 to 19 are equal to the sign bit, except for U/J, where they're equal to insn[12..19].
- var uOrJGate = OR_2INP_74XX32.create(sim, standardGateSeries, 1);
- uOrJGate.inputs[0].connectTo(u);
- uOrJGate.inputs[1].connectTo(j);
- var notUOrJGate = INV_74XX04.create(sim, standardGateSeries, 1);
- notUOrJGate.inputs[0].connectTo(uOrJGate.output);
- TristateBus bit12To19Bus = new TristateBus(sim, 8);
- var bit12To19SignDriver = new TristateBusDriver244(sim, bit12To19Bus, busDriverSeries);
- var bit12To19ImmDriver = new TristateBusDriver244(sim, bit12To19Bus, busDriverSeries);
- bit12To19SignDriver.dataIn.connectTo(signBit.signExtend(8));
- bit12To19SignDriver.nOE.connectTo(uOrJGate.output); //Sign bit for anything but U/J
- bit12To19ImmDriver.dataIn.connectTo(insn.subset(12, 8));
- bit12To19ImmDriver.nOE.connectTo(notUOrJGate.output); //Immediate bits for U/J
- OutputPort imm12To19 = bit12To19Bus.output;
- //Bits 20 to 30 are equal to the sign bit, except for U, where they're equal to insn[20..30].
- TristateBus bit20To30Bus = new TristateBus(sim, 11);
- var bit20To30SignDriver = new TristateBusDriver244(sim, bit20To30Bus, busDriverSeries);
- var bit20To30ImmDriver = new TristateBusDriver244(sim, bit20To30Bus, busDriverSeries);
- bit20To30SignDriver.dataIn.connectTo(signBit.signExtend(11));
- bit20To30SignDriver.nOE.connectTo(u); //Sign bit for anything but U
- bit20To30ImmDriver.dataIn.connectTo(insn.subset(20, 11));
- bit20To30ImmDriver.nOE.connectTo(notU); //Immediate bits for U
- OutputPort imm20To30 = bit20To30Bus.output;
- //Assemble the final immediate value
- this.immediateOutput = concat(imm0, imm1To4, imm5To10, imm11, imm12To19, imm20To30, signBit);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement