Changelog
- 14 Feb 2018: Corrected the example output from prog3.yo.
- 14 Feb 2018: Refer to comment starting “let’s also read and write” instead of prior semseter’s tiny.hcl which said “let’s also increment”
Your tasks
For each of these tasks, see the more detailed instructions and hints below.
-
Setup and test HCLRS as described below.
-
To learn how to use HCLRS and the accompanying Y86 tools for future labs:
- Run the supplied
tiny.hclfile on a.yofile (Y86 program) - Assemble a
.ysinto a.yofile - Run the supplied Y86 simulator on a yo file
- Run the supplied
- Write a
pc.hclbased on the suppliedtiny.hclthat:- advances the PC properly for Y86 instructions that are not jumps, call, or ret, and
- sets
StattoSTAT_INS(invalid instruction) for any unimplemented or unrecognizedicode.
-
Test your
pc.hclusingmake test-pc(many automated tests) and/or by manually running it on input files and comparing to the outputs shown below. - Submit your
pc.hclto archimedes
More detailed instructions
Setup and test HCLRS
-
Get a copy of hclrs.tar. See the hclrs README for more information.
-
Build
hclrsand the accompanying Y86 tools withmake -
Build the supplied example
tinysimulator and run it ony86/prog3.yowith./hclrs tiny.hcl y86/prog3.yo -qThis should result in output like:
+----------------------- halted in state: ------------------------------+ | RAX: ffffffffffffd2b4 RCX: 0 RDX: 0 | | RBX: 0 RSP: 0 RBP: 0 | | RSI: 0 RDI: 0 R8: 0 | | R9: 0 R10: 0 R11: 0 | | R12: 0 R13: 0 R14: 0 | | register pP(N) { pc=0000000000000003 } | | used memory: _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f | | 0x0000000_: 30 f2 0a 00 00 00 00 00 00 00 30 f0 03 00 00 00 | | 0x0000001_: 00 00 00 00 10 60 20 00 | +--------------------- (end of halted state) ---------------------------+ Cycles run: 3showing the values of the built-in regsiters, memory, and the
pcregister declared bytiny.hcl.
Assemble a .ys file into .yo file
-
Create a file
toy.yswithirmovq $6552,%rdx rrmovq %rdx,%rax addq %rax,%rdx halt -
Assemble
toy.ysintotoy.yousing the supplied assemblertools/yasmake toy.yoor
tools/yas toy.ys -
Examine
toy.yoin a text editor
Use the yis Y86 simulator
-
tools/yisis a Y86 simulator you can use to see what.yofiles are supposed to do. For exampletools/yis toy.yoshould give:Stopped in 4 steps at PC = 0xe. Status 'HLT', CC Z=0 S=0 O=0 Changes to registers: %rax: 0x0000000000000000 0x0000000000001998 %rdx: 0x0000000000000000 0x0000000000003330 Changes to memory:The hclrs README provides more detail about inteprreting this output under the heading “Seeing what a
.yofile is supposed to do”.
Write pc.hcl
-
Copy
tiny.hcltopc.hcl. Alternately, you can make an HCL file from scratch and with apcregister declared like intiny.hcl. -
Edit
pc.hclso that the pc updates work in the case where there are not jump, call, or return statements. You’ll almost certainly want to consult the Y86-64 instruction set described in figure 4.2 (page 357) to do this.-
If you started with
tiny.hcl, we won’t be needing to use the register file in this assignment, so remove the block of hcl that starts with the comment# let's also read and write a register… (but keep the line that updatesp_pc) -
Have the hcl read each instruction and get it’s
icode(tiny.hcldoes this already) -
Set the
Statoutput toSTAT_INS(invalid instruction error) if there is ajXX,call, orreticode; also toSTAT_INSfor any icode greater than 11 (unused icodes); toSTAT_HLTif there is ahalticode; and toSTAT_AOKfor all othericode.In
tiny.hcl, there was already a lineStat = [that set theStatto eitherSTAT_AOKorSTAT_HLT. You’ll need to change it to also setSTAT_INSfor some icodes. -
Update the
p_pcto beP_pc +an appropriate offset (1, 2, 9, or 10, depending on theicode).There is a line
p_pc = P_pc + 1;– you will need to change it so that uses a mux to select what number is added topc.
-
Testing pc.hcl manually
Here are some example outputs from running a command like
./hclrs pc.hcl y86/FILE.yo -q
-
y86/prog1.yoshould give+----------------------- halted in state: ------------------------------+ | RAX: 0 RCX: 0 RDX: 0 | | RBX: 0 RSP: 0 RBP: 0 | | RSI: 0 RDI: 0 R8: 0 | | R9: 0 R10: 0 R11: 0 | | R12: 0 R13: 0 R14: 0 | | register pP(N) { pc=000000000000001a } | | used memory: _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f | | 0x0000000_: 30 f2 0a 00 00 00 00 00 00 00 30 f0 03 00 00 00 | | 0x0000001_: 00 00 00 00 10 10 10 60 20 00 | +--------------------- (end of halted state) ---------------------------+ Cycles run: 7 -
y86/prog7.yoshould give+------------------- error caused in state: ----------------------------+ | RAX: 0 RCX: 0 RDX: 0 | | RBX: 0 RSP: 0 RBP: 0 | | RSI: 0 RDI: 0 R8: 0 | | R9: 0 R10: 0 R11: 0 | | R12: 0 R13: 0 R14: 0 | | register pP(N) { pc=000000000000000b } | | used memory: _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f | | 0x0000000_: 63 00 74 16 00 00 00 00 00 00 00 30 f0 01 00 00 | | 0x0000001_: 00 00 00 00 00 00 30 f2 02 00 00 00 00 00 00 00 | | 0x0000002_: 30 f3 03 00 00 00 00 00 00 00 00 | +-------------------- (end of error state) -----------------------------+ Cycles run: 2 Error code: 4 (Invalid Instruction) -
y86/poptest.yoshould give+----------------------- halted in state: ------------------------------+ | RAX: 0 RCX: 0 RDX: 0 | | RBX: 0 RSP: 0 RBP: 0 | | RSI: 0 RDI: 0 R8: 0 | | R9: 0 R10: 0 R11: 0 | | R12: 0 R13: 0 R14: 0 | | register pP(N) { pc=0000000000000019 } | | used memory: _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f | | 0x0000000_: 30 f4 00 01 00 00 00 00 00 00 30 f0 cd ab 00 00 | | 0x0000001_: 00 00 00 00 a0 0f b0 4f 00 | +--------------------- (end of halted state) ---------------------------+ Cycles run: 5 -
Other files. Look in the
testdata/pc-referencedirectory to see what our output shows for each of the supplied.yofiles in they86directory. The outputs in thetestdata/pc-referencedirectory omit the final value of the PC register, but yourpc.hclshould match them in the number of cycles run and error code (if any).
Testing pc.hcl using make test-pc
-
make test-pcwill runpc.hcland compare the results to a set of outputs in thetestdata/pc-referencedirectory. -
When a test fails, the testing program will display the difference between your output and the expected output. This output is a bit hard to understand. The hclrs README has a description of how to read it under the heading “suplied testing scripts”.
Hints
tiny.hclhas many comments which may be helpful.