From 911ff3d3bdd5c7345254aac95024b1f58860c8e4 Mon Sep 17 00:00:00 2001 From: "18218461270@163.com" <18218461270@163.com> Date: Sat, 23 Aug 2025 02:26:04 +0800 Subject: [PATCH] update archlab --- arch/Makefile | 37 + arch/README | 22 + arch/archlab.pdf | Bin 0 -> 166655 bytes arch/sim/Makefile | 38 + arch/sim/README | 97 ++ arch/sim/misc/Makefile | 59 + arch/sim/misc/README | 71 ++ arch/sim/misc/copy.ys | 44 + arch/sim/misc/examples.c | 50 + arch/sim/misc/hcl.lex | 45 + arch/sim/misc/hcl.y | 96 ++ arch/sim/misc/isa.c | 943 ++++++++++++++++ arch/sim/misc/isa.h | 210 ++++ arch/sim/misc/mux4.hcl | 57 + arch/sim/misc/node.c | 703 ++++++++++++ arch/sim/misc/node.h | 35 + arch/sim/misc/outgen.c | 71 ++ arch/sim/misc/outgen.h | 18 + arch/sim/misc/rsum.ys | 37 + arch/sim/misc/sum.ys | 36 + arch/sim/misc/yas-grammar.lex | 39 + arch/sim/misc/yas.c | 628 +++++++++++ arch/sim/misc/yas.h | 13 + arch/sim/misc/yis.c | 64 ++ arch/sim/pipe/Makefile | 63 ++ arch/sim/pipe/README | 150 +++ arch/sim/pipe/benchmark.pl | 110 ++ arch/sim/pipe/check-len.pl | 25 + arch/sim/pipe/correctness.pl | 139 +++ arch/sim/pipe/gen-driver.pl | 247 +++++ arch/sim/pipe/ldriver.ys | 263 +++++ arch/sim/pipe/ncopy.c | 39 + arch/sim/pipe/ncopy.ys | 183 ++++ arch/sim/pipe/pipe-1w.hcl | 395 +++++++ arch/sim/pipe/pipe-broken.hcl | 331 ++++++ arch/sim/pipe/pipe-btfnt.hcl | 380 +++++++ arch/sim/pipe/pipe-full.hcl | 374 +++++++ arch/sim/pipe/pipe-lf.hcl | 379 +++++++ arch/sim/pipe/pipe-nobypass.hcl | 353 ++++++ arch/sim/pipe/pipe-nt.hcl | 371 +++++++ arch/sim/pipe/pipe-std.hcl | 356 ++++++ arch/sim/pipe/pipe.tcl | 633 +++++++++++ arch/sim/pipe/pipeline.h | 67 ++ arch/sim/pipe/psim.c | 1604 ++++++++++++++++++++++++++++ arch/sim/pipe/sdriver.ys | 145 +++ arch/sim/pipe/sim.h | 153 +++ arch/sim/pipe/stages.h | 90 ++ arch/sim/ptest/Makefile | 20 + arch/sim/ptest/README | 36 + arch/sim/ptest/ctest.pl | 113 ++ arch/sim/ptest/etest.pl | 75 ++ arch/sim/ptest/htest.pl | 249 +++++ arch/sim/ptest/jtest.pl | 127 +++ arch/sim/ptest/optest.pl | 92 ++ arch/sim/ptest/tester.pm | 187 ++++ arch/sim/seq/Makefile | 65 ++ arch/sim/seq/README | 91 ++ arch/sim/seq/description.md | 11 + arch/sim/seq/seq+-std.hcl | 226 ++++ arch/sim/seq/seq+.tcl | 540 ++++++++++ arch/sim/seq/seq-full.hcl | 224 ++++ arch/sim/seq/seq-std.hcl | 217 ++++ arch/sim/seq/seq.tcl | 540 ++++++++++ arch/sim/seq/sim.h | 108 ++ arch/sim/seq/ssim.c | 1169 ++++++++++++++++++++ arch/sim/y86-code/Makefile | 54 + arch/sim/y86-code/README | 20 + arch/sim/y86-code/abs-asum-cmov.ys | 46 + arch/sim/y86-code/abs-asum-jmp.ys | 46 + arch/sim/y86-code/asum.ys | 35 + arch/sim/y86-code/asumi.ys | 38 + arch/sim/y86-code/asumr.ys | 42 + arch/sim/y86-code/cjr.ys | 17 + arch/sim/y86-code/j-cc.ys | 15 + arch/sim/y86-code/poptest.ys | 6 + arch/sim/y86-code/prog1.ys | 8 + arch/sim/y86-code/prog10.ys | 7 + arch/sim/y86-code/prog2.ys | 7 + arch/sim/y86-code/prog3.ys | 6 + arch/sim/y86-code/prog4.ys | 5 + arch/sim/y86-code/prog5.ys | 8 + arch/sim/y86-code/prog6.ys | 14 + arch/sim/y86-code/prog7.ys | 13 + arch/sim/y86-code/prog8.ys | 5 + arch/sim/y86-code/prog9.ys | 9 + arch/sim/y86-code/pushquestion.ys | 5 + arch/sim/y86-code/pushtest.ys | 7 + arch/sim/y86-code/ret-hazard.ys | 13 + arch/simguide.pdf | Bin 0 -> 584325 bytes 89 files changed, 14779 insertions(+) create mode 100644 arch/Makefile create mode 100644 arch/README create mode 100644 arch/archlab.pdf create mode 100644 arch/sim/Makefile create mode 100644 arch/sim/README create mode 100644 arch/sim/misc/Makefile create mode 100644 arch/sim/misc/README create mode 100644 arch/sim/misc/copy.ys create mode 100644 arch/sim/misc/examples.c create mode 100644 arch/sim/misc/hcl.lex create mode 100644 arch/sim/misc/hcl.y create mode 100644 arch/sim/misc/isa.c create mode 100644 arch/sim/misc/isa.h create mode 100644 arch/sim/misc/mux4.hcl create mode 100644 arch/sim/misc/node.c create mode 100644 arch/sim/misc/node.h create mode 100644 arch/sim/misc/outgen.c create mode 100644 arch/sim/misc/outgen.h create mode 100644 arch/sim/misc/rsum.ys create mode 100644 arch/sim/misc/sum.ys create mode 100644 arch/sim/misc/yas-grammar.lex create mode 100644 arch/sim/misc/yas.c create mode 100644 arch/sim/misc/yas.h create mode 100644 arch/sim/misc/yis.c create mode 100644 arch/sim/pipe/Makefile create mode 100644 arch/sim/pipe/README create mode 100755 arch/sim/pipe/benchmark.pl create mode 100755 arch/sim/pipe/check-len.pl create mode 100755 arch/sim/pipe/correctness.pl create mode 100755 arch/sim/pipe/gen-driver.pl create mode 100644 arch/sim/pipe/ldriver.ys create mode 100644 arch/sim/pipe/ncopy.c create mode 100644 arch/sim/pipe/ncopy.ys create mode 100644 arch/sim/pipe/pipe-1w.hcl create mode 100644 arch/sim/pipe/pipe-broken.hcl create mode 100644 arch/sim/pipe/pipe-btfnt.hcl create mode 100644 arch/sim/pipe/pipe-full.hcl create mode 100644 arch/sim/pipe/pipe-lf.hcl create mode 100644 arch/sim/pipe/pipe-nobypass.hcl create mode 100644 arch/sim/pipe/pipe-nt.hcl create mode 100644 arch/sim/pipe/pipe-std.hcl create mode 100755 arch/sim/pipe/pipe.tcl create mode 100644 arch/sim/pipe/pipeline.h create mode 100644 arch/sim/pipe/psim.c create mode 100644 arch/sim/pipe/sdriver.ys create mode 100644 arch/sim/pipe/sim.h create mode 100644 arch/sim/pipe/stages.h create mode 100644 arch/sim/ptest/Makefile create mode 100644 arch/sim/ptest/README create mode 100755 arch/sim/ptest/ctest.pl create mode 100755 arch/sim/ptest/etest.pl create mode 100755 arch/sim/ptest/htest.pl create mode 100755 arch/sim/ptest/jtest.pl create mode 100755 arch/sim/ptest/optest.pl create mode 100644 arch/sim/ptest/tester.pm create mode 100644 arch/sim/seq/Makefile create mode 100644 arch/sim/seq/README create mode 100644 arch/sim/seq/description.md create mode 100644 arch/sim/seq/seq+-std.hcl create mode 100644 arch/sim/seq/seq+.tcl create mode 100644 arch/sim/seq/seq-full.hcl create mode 100644 arch/sim/seq/seq-std.hcl create mode 100644 arch/sim/seq/seq.tcl create mode 100644 arch/sim/seq/sim.h create mode 100644 arch/sim/seq/ssim.c create mode 100644 arch/sim/y86-code/Makefile create mode 100644 arch/sim/y86-code/README create mode 100644 arch/sim/y86-code/abs-asum-cmov.ys create mode 100644 arch/sim/y86-code/abs-asum-jmp.ys create mode 100644 arch/sim/y86-code/asum.ys create mode 100644 arch/sim/y86-code/asumi.ys create mode 100644 arch/sim/y86-code/asumr.ys create mode 100644 arch/sim/y86-code/cjr.ys create mode 100644 arch/sim/y86-code/j-cc.ys create mode 100644 arch/sim/y86-code/poptest.ys create mode 100644 arch/sim/y86-code/prog1.ys create mode 100644 arch/sim/y86-code/prog10.ys create mode 100644 arch/sim/y86-code/prog2.ys create mode 100644 arch/sim/y86-code/prog3.ys create mode 100644 arch/sim/y86-code/prog4.ys create mode 100644 arch/sim/y86-code/prog5.ys create mode 100644 arch/sim/y86-code/prog6.ys create mode 100644 arch/sim/y86-code/prog7.ys create mode 100644 arch/sim/y86-code/prog8.ys create mode 100644 arch/sim/y86-code/prog9.ys create mode 100644 arch/sim/y86-code/pushquestion.ys create mode 100644 arch/sim/y86-code/pushtest.ys create mode 100644 arch/sim/y86-code/ret-hazard.ys create mode 100644 arch/simguide.pdf diff --git a/arch/Makefile b/arch/Makefile new file mode 100644 index 0000000..81006f0 --- /dev/null +++ b/arch/Makefile @@ -0,0 +1,37 @@ +#################################################### +# Students' Makefile for the CS:APP Architecture Lab +#################################################### + +# Default team name and version number +TEAM = bovik +VERSION = 1 + +# Where are the different parts of the lab should be copied to when they +# are handed in. +HANDINDIR-PARTA = /afs/cs/academic/class/15349-s02/archlab/handin-parta +HANDINDIR-PARTB = /afs/cs/academic/class/15349-s02/archlab/handin-partb +HANDINDIR-PARTC = /afs/cs/academic/class/15349-s02/archlab/handin-partc + +sim: + (cd sim; make) + +# Use this rule to hand in Part A ("make handin-parta") +handin-parta: + cp sim/misc/sum.ys $(HANDINDIR-PARTA)/$(TEAM)-$(VERSION)-sum.ys + cp sim/misc/rsum.ys $(HANDINDIR-PARTA)/$(TEAM)-$(VERSION)-rsum.ys + cp sim/misc/copy.ys $(HANDINDIR-PARTA)/$(TEAM)-$(VERSION)-copy.ys + +# Use this rule to handin Part B ("make handin-partb") +handin-partb: + cp sim/seq/seq-full.hcl $(HANDINDIR-PARTB)/$(TEAM)-$(VERSION)-seq-full.hcl + +# Use this rule to handin Part C ("make handin-partc") +handin-partc: + cp sim/pipe/ncopy.ys $(HANDINDIR-PARTC)/$(TEAM)-$(VERSION)-ncopy.ys + cp sim/pipe/pipe-full.hcl $(HANDINDIR-PARTC)/$(TEAM)-$(VERSION)-pipe-full.hcl + +clean: + rm -f *~ *.o + + + diff --git a/arch/README b/arch/README new file mode 100644 index 0000000..6608a94 --- /dev/null +++ b/arch/README @@ -0,0 +1,22 @@ +##################################################################### +# CS:APP Architecture Lab +# Handout files for students +# +# Copyright (c) 2002, 2010, 2015, R. Bryant and D. O'Hallaron, +# All rights reserved. May not be used, modified, or copied +# without permission. +# +###################################################################### + +This directory contains the files that you need for the CS:APP +architecture lab. + +****** +Files: +****** + +Makefile Use this to handin your solutions +README This file +archlab.{ps,pdf} Lab writeup +sim.tar Archive of the Y86-64 tools in tar format +simguide.{ps,pdf} CS:APP Guide to Simulators document diff --git a/arch/archlab.pdf b/arch/archlab.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21c87d082849ba21c69769a79c12fc50559e7f1a GIT binary patch literal 166655 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 X%cF make clean; make + +******** +2. Files +******** + +Makefile + Builds the Y86-64 tools + +README + This file + +misc/ + Source files for the Y86-64 assembler yas, the Y86-64 instruction + simulator yis, and the isa.c file that is used by the -t option + of the processor simulators to check the results against the + ISA simulation. Also contains files for the programs + hcl2c and hcl2v + +seq/ + Code for the SEQ and SEQ+ simulators. Contains HCL files for + labs and homework problems that involve modifying SEQ. + +pipe/ + Code for the PIPE simulator. Contains HCL files for labs and + homework problems that involve modifying PIPE. + +y86-code/ + Example .ys files from CS:APP and scripts for conducting + automated benchmark teseting of the new processor designs. + +ptest/ + Automated regression testing scripts for testing processor designs. + +verilog/ + System for producing Verilog designs from HCL code diff --git a/arch/sim/misc/Makefile b/arch/sim/misc/Makefile new file mode 100644 index 0000000..e2cc86c --- /dev/null +++ b/arch/sim/misc/Makefile @@ -0,0 +1,59 @@ +CC=gcc +CFLAGS=-Wall -O1 -g -fcommon +LCFLAGS=-O1 -fcommon +LEX = flex +YACC=bison +LEXLIB = -lfl +YAS=./yas + +all: yis yas hcl2c + +# These are implicit rules for making .yo files from .ys files. +# E.g., make sum.yo +.SUFFIXES: .ys .yo +.ys.yo: + $(YAS) $*.ys + +# These are the explicit rules for making yis yas and hcl2c and hcl2v +yas-grammar.o: yas-grammar.c + $(CC) $(LCFLAGS) -c yas-grammar.c + +yas-grammar.c: yas-grammar.lex + $(LEX) yas-grammar.lex + mv lex.yy.c yas-grammar.c + +isa.o: isa.c isa.h + $(CC) $(CFLAGS) -c isa.c + +yas.o: yas.c yas.h isa.h + $(CC) $(CFLAGS) -c yas.c + +yas: yas.o yas-grammar.o isa.o + $(CC) $(CFLAGS) yas-grammar.o yas.o isa.o ${LEXLIB} -o yas + +yis.o: yis.c isa.h + $(CC) $(CFLAGS) -c yis.c + +yis: yis.o isa.o + $(CC) $(CFLAGS) yis.o isa.o -o yis + +hcl2c: hcl.tab.c lex.yy.c node.c outgen.c + $(CC) $(LCFLAGS) node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c + +hcl2v: hcl.tab.c lex.yy.c node.c outgen.c + $(CC) $(LCFLAGS) -DVLOG node.c lex.yy.c hcl.tab.c outgen.c -o hcl2v + +hcl2u: hcl.tab.c lex.yy.c node.c outgen.c + $(CC) $(LCFLAGS) -DUCLID node.c lex.yy.c hcl.tab.c outgen.c -o hcl2u + +lex.yy.c: hcl.lex + $(LEX) hcl.lex + +hcl.tab.c: hcl.y + $(YACC) -d hcl.y + +clean: + rm -f *.o *.yo *.exe yis yas hcl2c mux4 *~ core.* + rm -f hcl.tab.c hcl.tab.h lex.yy.c yas-grammar.c + + diff --git a/arch/sim/misc/README b/arch/sim/misc/README new file mode 100644 index 0000000..e1cbdd5 --- /dev/null +++ b/arch/sim/misc/README @@ -0,0 +1,71 @@ +/*********************************************************************** + * Y86-64 Assembler, Instruction Simulator, and HCL translator + * + * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. + * May not be used, modified, or copied without permission. + ***********************************************************************/ + +This directory contains all of the source files for the following: + +YAS Y86-64 assembler +YIS Y86-64 instruction level simulator +HCL2C HCL to C translator +HCL2V HCL to Verilog translator + +********************* +1. Building the tools +********************* + +unix> make clean +unix> make + +******** +2. Files +******** + +Makefile Builds yas, yis, hcl2c, hcl2v +README This file + +* Versions of Makefile in the student's distribution +* (Instructor distribution only) +Makefile-sim + +* Example programs for Part A of the CS:APP Architecture Lab +examples.c C versions of three Y86-64 functions +ans-copy.ys Solution copy function (instructor distribution only) +ans-sum.ys Solution sum function (instructor distribution only) +ans-rsum.ys Solution rsum function (instructor distribution only) + + +* Instruction simulator code shared by yas, yis, ssim, ssim+, and psim +isa.c +isa.h + +* Files used to build the yas assembler +yas The YAS binary +yas.c yas source file and header file +yas.h +yas-grammar.lex Y86-64 lexical scanner spec +yas-grammar.c Lexical scanner generated from yas-grammar.lex + +* Files used to build the yis instruction simulator +yis The YIS binary +yis.c yis source file + +* Files used to build the hcl2c translator +hcl2c The HCL2C binary +node.c auxiliary routines and header file +node.h +hcl.lex HCL lexical scanner spec +lex.yy.c HCL lexical scanner generated from hcl.lex +hcl.y HCL grammar +hcl.tab.c HCL parser generated from hcl.y +hcl.tab.h Token definitions + +* Example HCL programs used during the writing of the CS:APP book +* (Instructor distribution only) +frag.{hcl,c} +mux4.{hcl,c} +reg-file.{hcl,c} + + diff --git a/arch/sim/misc/copy.ys b/arch/sim/misc/copy.ys new file mode 100644 index 0000000..f433453 --- /dev/null +++ b/arch/sim/misc/copy.ys @@ -0,0 +1,44 @@ + .pos 0 + irmovq stack, %rsp + call main + halt + + .align 8 +# Source block +src: + .quad 0x00a + .quad 0x0b0 + .quad 0xc00 + +# Destination block +dest: + .quad 0x111 + .quad 0x222 + .quad 0x333 + +main: + irmovq src, %rdi + irmovq dest, %rsi + irmovq $3, %rdx + call copy + ret + +copy: + xorq %rax, %rax + irmovq $1, %rcx + irmovq $8, %r8 + jmp test +loop: + mrmovq (%rdi), %r9 + rmmovq %r9, (%rsi) + xorq %r9, %rax + addq %r8, %rdi + addq %r8, %rsi + subq %rcx, %rdx +test: + andq %rdx, %rdx + jg loop + ret + + .pos 0x200 +stack: diff --git a/arch/sim/misc/examples.c b/arch/sim/misc/examples.c new file mode 100644 index 0000000..6f09d43 --- /dev/null +++ b/arch/sim/misc/examples.c @@ -0,0 +1,50 @@ +/* + * Architecture Lab: Part A + * + * High level specs for the functions that the students will rewrite + * in Y86-64 assembly language + */ + +/* $begin examples */ +/* linked list element */ +typedef struct ELE { + long val; + struct ELE *next; +} *list_ptr; + +/* sum_list - Sum the elements of a linked list */ +long sum_list(list_ptr ls) +{ + long val = 0; + while (ls) { + val += ls->val; + ls = ls->next; + } + return val; +} + +/* rsum_list - Recursive version of sum_list */ +long rsum_list(list_ptr ls) +{ + if (!ls) + return 0; + else { + long val = ls->val; + long rest = rsum_list(ls->next); + return val + rest; + } +} + +/* copy_block - Copy src to dest and return xor checksum of src */ +long copy_block(long *src, long *dest, long len) +{ + long result = 0; + while (len > 0) { + long val = *src++; + *dest++ = val; + result ^= val; + len--; + } + return result; +} +/* $end examples */ diff --git a/arch/sim/misc/hcl.lex b/arch/sim/misc/hcl.lex new file mode 100644 index 0000000..f2ca313 --- /dev/null +++ b/arch/sim/misc/hcl.lex @@ -0,0 +1,45 @@ +%{ +#include +#include "node.h" +#define YYSTYPE node_ptr +#include "hcl.tab.h" + + +extern YYSTYPE yylval; +extern int lineno; +%} +%% +[ \r\t\f] ; +[\n] lineno++; +"#".*\n lineno++ ; +quote return(QUOTE); +boolsig return(BOOLARG); +bool return(BOOL); +wordsig return(WORDARG); +word return(WORD); +in return(IN); +'[^']*' yylval = make_quote(yytext); return(QSTRING); +[a-zA-Z][a-zA-Z0-9_]* yylval = make_var(yytext); return(VAR); +[0-9][0-9]* yylval = make_num(yytext); return(NUM); +-[0-9][0-9]* yylval = make_num(yytext); return(NUM); +"=" return(ASSIGN); +";" return(SEMI); +":" return(COLON); +"," return(COMMA); +"(" return(LPAREN); +")" return(RPAREN); +"{" return(LBRACE); +"}" return(RBRACE); +"[" return(LBRACK); +"]" return(RBRACK); +"&&" return(AND); +"||" return(OR); +"!=" yylval = make_var(yytext); return(COMP); +"==" yylval = make_var(yytext); return(COMP); +"<" yylval = make_var(yytext); return(COMP); +"<=" yylval = make_var(yytext); return(COMP); +">" yylval = make_var(yytext); return(COMP); +">=" yylval = make_var(yytext); return(COMP); +"!" return(NOT); +%% + diff --git a/arch/sim/misc/hcl.y b/arch/sim/misc/hcl.y new file mode 100644 index 0000000..269a2f6 --- /dev/null +++ b/arch/sim/misc/hcl.y @@ -0,0 +1,96 @@ +%{ +#include +#include +#include +#include "node.h" +#define YYSTYPE node_ptr + +/* Current line number. Maintained by lex */ +int lineno = 1; +#define ERRLIM 5 +int errcnt = 0; + + + +FILE *outfile; + +int yyparse(void); +int yylex(void); + +void yyerror(const char *str) +{ + fprintf(stderr, "Error, near line %d: %s\n", lineno, str); + if (++errcnt > ERRLIM) { + fprintf(stderr, "Too many errors, aborting\n"); + exit(1); + } +} + +static char errmsg[1024]; +void yyserror(const char *str, char *other) +{ + sprintf(errmsg, str, other); + yyerror(errmsg); +} + +int yywrap() +{ + return 1; +} + +int main(int argc, char **argv) +{ + init_node(argc, argv); + outfile = stdout; + yyparse(); + finish_node(0); + return errcnt != 0; +} + +%} + +%token QUOTE BOOLARG BOOL WORDARG WORD QSTRING + VAR NUM ASSIGN SEMI COLON COMMA LPAREN RPAREN LBRACE + RBRACE LBRACK RBRACK AND OR NOT COMP IN + +/* All operators are left associative. Listed from lowest to highest */ +%left OR +%left AND +%left NOT +%left COMP +%left IN + +%% + +statements: /* empty */ + | statements statement + ; + +statement: + QUOTE QSTRING { insert_code($2); } + | BOOLARG VAR QSTRING { add_arg($2, $3, 1); } + | WORDARG VAR QSTRING { add_arg($2, $3, 0); } + | BOOL VAR ASSIGN expr SEMI { gen_funct($2, $4, 1); } + | WORD VAR ASSIGN expr SEMI { gen_funct($2, $4, 0); } + ; + +expr: + VAR { $$=$1; } + | NUM { $$=$1; } + | LPAREN expr RPAREN { $$=$2; } + | NOT expr { $$=make_not($2); } + | expr AND expr { $$=make_and($1, $3); } + | expr OR expr { $$=make_or($1, $3); } + | expr COMP expr { $$=make_comp($2,$1,$3); } + | expr IN LBRACE exprlist RBRACE { $$=make_ele($1, $4);} + | LBRACK caselist RBRACK { $$=$2; } + ; + +exprlist: + expr { $$=$1; } + | exprlist COMMA expr { $$=concat($1, $3); } + +caselist: + /* Empty */ { $$=NULL; } + | caselist expr COLON expr SEMI { $$=concat($1, make_case($2, $4));} + diff --git a/arch/sim/misc/isa.c b/arch/sim/misc/isa.c new file mode 100644 index 0000000..484e422 --- /dev/null +++ b/arch/sim/misc/isa.c @@ -0,0 +1,943 @@ +#include +#include +#include +#include +#include "isa.h" + + +/* Are we running in GUI mode? */ +extern int gui_mode; + +/* Bytes Per Line = Block size of memory */ +#define BPL 32 + +struct { + char *name; + int id; +} reg_table[REG_ERR+1] = +{ + {"%rax", REG_RAX}, + {"%rcx", REG_RCX}, + {"%rdx", REG_RDX}, + {"%rbx", REG_RBX}, + {"%rsp", REG_RSP}, + {"%rbp", REG_RBP}, + {"%rsi", REG_RSI}, + {"%rdi", REG_RDI}, + {"%r8", REG_R8}, + {"%r9", REG_R9}, + {"%r10", REG_R10}, + {"%r11", REG_R11}, + {"%r12", REG_R12}, + {"%r13", REG_R13}, + {"%r14", REG_R14}, + {"----", REG_NONE}, + {"----", REG_ERR} +}; + + +reg_id_t find_register(char *name) +{ + int i; + for (i = 0; i < REG_NONE; i++) + if (!strcmp(name, reg_table[i].name)) + return reg_table[i].id; + return REG_ERR; +} + +char *reg_name(reg_id_t id) +{ + if (id >= 0 && id < REG_NONE) + return reg_table[id].name; + else + return reg_table[REG_NONE].name; +} + +/* Is the given register ID a valid program register? */ +int reg_valid(reg_id_t id) +{ + return id >= 0 && id < REG_NONE && reg_table[id].id == id; +} + +instr_t instruction_set[] = +{ + {"nop", HPACK(I_NOP, F_NONE), 1, NO_ARG, 0, 0, NO_ARG, 0, 0 }, + {"halt", HPACK(I_HALT, F_NONE), 1, NO_ARG, 0, 0, NO_ARG, 0, 0 }, + {"rrmovq", HPACK(I_RRMOVQ, F_NONE), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + /* Conditional move instructions are variants of RRMOVQ */ + {"cmovle", HPACK(I_RRMOVQ, C_LE), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"cmovl", HPACK(I_RRMOVQ, C_L), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"cmove", HPACK(I_RRMOVQ, C_E), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"cmovne", HPACK(I_RRMOVQ, C_NE), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"cmovge", HPACK(I_RRMOVQ, C_GE), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"cmovg", HPACK(I_RRMOVQ, C_G), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + /* arg1hi indicates number of bytes */ + {"irmovq", HPACK(I_IRMOVQ, F_NONE), 10, I_ARG, 2, 8, R_ARG, 1, 0 }, + {"rmmovq", HPACK(I_RMMOVQ, F_NONE), 10, R_ARG, 1, 1, M_ARG, 1, 0 }, + {"mrmovq", HPACK(I_MRMOVQ, F_NONE), 10, M_ARG, 1, 0, R_ARG, 1, 1 }, + {"addq", HPACK(I_ALU, A_ADD), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"subq", HPACK(I_ALU, A_SUB), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"andq", HPACK(I_ALU, A_AND), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + {"xorq", HPACK(I_ALU, A_XOR), 2, R_ARG, 1, 1, R_ARG, 1, 0 }, + /* arg1hi indicates number of bytes */ + {"jmp", HPACK(I_JMP, C_YES), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"jle", HPACK(I_JMP, C_LE), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"jl", HPACK(I_JMP, C_L), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"je", HPACK(I_JMP, C_E), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"jne", HPACK(I_JMP, C_NE), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"jge", HPACK(I_JMP, C_GE), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"jg", HPACK(I_JMP, C_G), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"call", HPACK(I_CALL, F_NONE), 9, I_ARG, 1, 8, NO_ARG, 0, 0 }, + {"ret", HPACK(I_RET, F_NONE), 1, NO_ARG, 0, 0, NO_ARG, 0, 0 }, + {"pushq", HPACK(I_PUSHQ, F_NONE) , 2, R_ARG, 1, 1, NO_ARG, 0, 0 }, + {"popq", HPACK(I_POPQ, F_NONE) , 2, R_ARG, 1, 1, NO_ARG, 0, 0 }, + {"iaddq", HPACK(I_IADDQ, F_NONE), 10, I_ARG, 2, 8, R_ARG, 1, 0 }, + /* this is just a hack to make the I_POP2 code have an associated name */ + {"pop2", HPACK(I_POP2, F_NONE) , 0, NO_ARG, 0, 0, NO_ARG, 0, 0 }, + + /* For allocation instructions, arg1hi indicates number of bytes */ + {".byte", 0x00, 1, I_ARG, 0, 1, NO_ARG, 0, 0 }, + {".word", 0x00, 2, I_ARG, 0, 2, NO_ARG, 0, 0 }, + {".long", 0x00, 4, I_ARG, 0, 4, NO_ARG, 0, 0 }, + {".quad", 0x00, 8, I_ARG, 0, 8, NO_ARG, 0, 0 }, + {NULL, 0 , 0, NO_ARG, 0, 0, NO_ARG, 0, 0 } +}; + +instr_t invalid_instr = + {"XXX", 0 , 0, NO_ARG, 0, 0, NO_ARG, 0, 0 }; + +instr_ptr find_instr(char *name) +{ + int i; + for (i = 0; instruction_set[i].name; i++) + if (strcmp(instruction_set[i].name,name) == 0) + return &instruction_set[i]; + return NULL; +} + +/* Return name of instruction given its encoding */ +char *iname(int instr) { + int i; + for (i = 0; instruction_set[i].name; i++) { + if (instr == instruction_set[i].code) + return instruction_set[i].name; + } + return ""; +} + + +instr_ptr bad_instr() +{ + return &invalid_instr; +} + + +mem_t init_mem(int len) +{ + + mem_t result = (mem_t) malloc(sizeof(mem_rec)); + len = ((len+BPL-1)/BPL)*BPL; + result->len = len; + result->contents = (byte_t *) calloc(len, 1); + return result; +} + +void clear_mem(mem_t m) +{ + memset(m->contents, 0, m->len); +} + +void free_mem(mem_t m) +{ + free((void *) m->contents); + free((void *) m); +} + +mem_t copy_mem(mem_t oldm) +{ + mem_t newm = init_mem(oldm->len); + memcpy(newm->contents, oldm->contents, oldm->len); + return newm; +} + +bool_t diff_mem(mem_t oldm, mem_t newm, FILE *outfile) +{ + word_t pos; + int len = oldm->len; + bool_t diff = FALSE; + if (newm->len < len) + len = newm->len; + for (pos = 0; (!diff || outfile) && pos < len; pos += 8) { + word_t ov = 0; word_t nv = 0; + get_word_val(oldm, pos, &ov); + get_word_val(newm, pos, &nv); + if (nv != ov) { + diff = TRUE; + if (outfile) + fprintf(outfile, "0x%.4llx:\t0x%.16llx\t0x%.16llx\n", pos, ov, nv); + } + } + return diff; +} + +int hex2dig(char c) +{ + if (isdigit((int)c)) + return c - '0'; + if (isupper((int)c)) + return c - 'A' + 10; + else + return c - 'a' + 10; +} + +#define LINELEN 4096 +int load_mem(mem_t m, FILE *infile, int report_error) +{ + /* Read contents of .yo file */ + char buf[LINELEN]; + char c, ch, cl; + int byte_cnt = 0; + int lineno = 0; + word_t bytepos = 0; +#ifdef HAS_GUI + int empty_line = 1; + int addr = 0; + char hexcode[21]; + /* For display */ + int line_no = 0; + char line[LINELEN]; + int index = 0; +#endif /* HAS_GUI */ + while (fgets(buf, LINELEN, infile)) { + int cpos = 0; +#ifdef HAS_GUI + empty_line = 1; +#endif + lineno++; + /* Skip white space */ + while (isspace((int)buf[cpos])) + cpos++; + + if (buf[cpos] != '0' || + (buf[cpos+1] != 'x' && buf[cpos+1] != 'X')) + continue; /* Skip this line */ + cpos+=2; + + /* Get address */ + bytepos = 0; + while (isxdigit((int)(c=buf[cpos]))) { + cpos++; + bytepos = bytepos*16 + hex2dig(c); + } + + while (isspace((int)buf[cpos])) + cpos++; + + if (buf[cpos++] != ':') { + if (report_error) { + fprintf(stderr, "Error reading file. Expected colon\n"); + fprintf(stderr, "Line %d:%s\n", lineno, buf); + fprintf(stderr, + "Reading '%c' at position %d\n", buf[cpos], cpos); + } + return 0; + } + +#ifdef HAS_GUI + addr = bytepos; + index = 0; +#endif + + while (isspace((int)buf[cpos])) + cpos++; + + /* Get code */ + while (isxdigit((int)(ch=buf[cpos++])) && + isxdigit((int)(cl=buf[cpos++]))) { + byte_t byte = 0; + if (bytepos >= m->len) { + if (report_error) { + fprintf(stderr, + "Error reading file. Invalid address. 0x%llx\n", + bytepos); + fprintf(stderr, "Line %d:%s\n", lineno, buf); + } + return 0; + } + byte = hex2dig(ch)*16+hex2dig(cl); + m->contents[bytepos++] = byte; + byte_cnt++; +#ifdef HAS_GUI + empty_line = 0; + hexcode[index++] = ch; + hexcode[index++] = cl; +#endif + } +#ifdef HAS_GUI + /* Fill rest of hexcode with blanks. + Needs to be 2x longest instruction */ + for (; index < 20; index++) + hexcode[index] = ' '; + hexcode[index] = '\0'; + + if (gui_mode) { + /* Now get the rest of the line */ + while (isspace((int)buf[cpos])) + cpos++; + cpos++; /* Skip over '|' */ + + index = 0; + while ((c = buf[cpos++]) != '\0' && c != '\n') { + line[index++] = c; + } + line[index] = '\0'; + if (!empty_line) + report_line(line_no++, addr, hexcode, line); + } +#endif /* HAS_GUI */ + } + return byte_cnt; +} + +bool_t get_byte_val(mem_t m, word_t pos, byte_t *dest) +{ + if (pos < 0 || pos >= m->len) + return FALSE; + *dest = m->contents[pos]; + return TRUE; +} + +bool_t get_word_val(mem_t m, word_t pos, word_t *dest) +{ + int i; + word_t val; + if (pos < 0 || pos + 8 > m->len) + return FALSE; + val = 0; + for (i = 0; i < 8; i++) { + word_t b = m->contents[pos+i] & 0xFF; + val = val | (b <<(8*i)); + } + *dest = val; + return TRUE; +} + +bool_t set_byte_val(mem_t m, word_t pos, byte_t val) +{ + if (pos < 0 || pos >= m->len) + return FALSE; + m->contents[pos] = val; + return TRUE; +} + +bool_t set_word_val(mem_t m, word_t pos, word_t val) +{ + int i; + if (pos < 0 || pos + 8 > m->len) + return FALSE; + for (i = 0; i < 8; i++) { + m->contents[pos+i] = (byte_t) val & 0xFF; + val >>= 8; + } + return TRUE; +} + +void dump_memory(FILE *outfile, mem_t m, word_t pos, int len) +{ + int i, j; + while (pos % BPL) { + pos --; + len ++; + } + + len = ((len+BPL-1)/BPL)*BPL; + + if (pos+len > m->len) + len = m->len-pos; + + for (i = 0; i < len; i+=BPL) { + word_t val = 0; + fprintf(outfile, "0x%.4llx:", pos+i); + for (j = 0; j < BPL; j+= 8) { + get_word_val(m, pos+i+j, &val); + fprintf(outfile, " %.16llx", val); + } + } +} + +mem_t init_reg() +{ + return init_mem(128); +} + +void free_reg(mem_t r) +{ + free_mem(r); +} + +mem_t copy_reg(mem_t oldr) +{ + return copy_mem(oldr); +} + +bool_t diff_reg(mem_t oldr, mem_t newr, FILE *outfile) +{ + word_t pos; + int len = oldr->len; + bool_t diff = FALSE; + if (newr->len < len) + len = newr->len; + for (pos = 0; (!diff || outfile) && pos < len; pos += 8) { + word_t ov = 0; + word_t nv = 0; + get_word_val(oldr, pos, &ov); + get_word_val(newr, pos, &nv); + if (nv != ov) { + diff = TRUE; + if (outfile) + fprintf(outfile, "%s:\t0x%.16llx\t0x%.16llx\n", + reg_table[pos/8].name, ov, nv); + } + } + return diff; +} + +word_t get_reg_val(mem_t r, reg_id_t id) +{ + word_t val = 0; + if (id >= REG_NONE) + return 0; + get_word_val(r,id*8, &val); + return val; +} + +void set_reg_val(mem_t r, reg_id_t id, word_t val) +{ + if (id < REG_NONE) { + set_word_val(r,id*8,val); +#ifdef HAS_GUI + if (gui_mode) { + signal_register_update(id, val); + } +#endif /* HAS_GUI */ + } +} + +void dump_reg(FILE *outfile, mem_t r) { + reg_id_t id; + for (id = 0; reg_valid(id); id++) { + fprintf(outfile, " %s ", reg_table[id].name); + } + fprintf(outfile, "\n"); + for (id = 0; reg_valid(id); id++) { + word_t val = 0; + get_word_val(r, id*8, &val); + fprintf(outfile, " %llx", val); + } + fprintf(outfile, "\n"); +} + +struct { + char symbol; + int id; +} alu_table[A_NONE+1] = +{ + {'+', A_ADD}, + {'-', A_SUB}, + {'&', A_AND}, + {'^', A_XOR}, + {'?', A_NONE} +}; + +char op_name(alu_t op) +{ + if (op < A_NONE) + return alu_table[op].symbol; + else + return alu_table[A_NONE].symbol; +} + +word_t compute_alu(alu_t op, word_t argA, word_t argB) +{ + word_t val; + switch(op) { + case A_ADD: + val = argA+argB; + break; + case A_SUB: + val = argB-argA; + break; + case A_AND: + val = argA&argB; + break; + case A_XOR: + val = argA^argB; + break; + default: + val = 0; + } + return val; +} + +cc_t compute_cc(alu_t op, word_t argA, word_t argB) +{ + word_t val = compute_alu(op, argA, argB); + bool_t zero = (val == 0); + bool_t sign = ((word_t)val < 0); + bool_t ovf; + switch(op) { + case A_ADD: + ovf = (((word_t) argA < 0) == ((word_t) argB < 0)) && + (((word_t) val < 0) != ((word_t) argA < 0)); + break; + case A_SUB: + ovf = (((word_t) argA > 0) == ((word_t) argB < 0)) && + (((word_t) val < 0) != ((word_t) argB < 0)); + break; + case A_AND: + case A_XOR: + ovf = FALSE; + break; + default: + ovf = FALSE; + } + return PACK_CC(zero,sign,ovf); + +} + +char *cc_names[8] = { + "Z=0 S=0 O=0", + "Z=0 S=0 O=1", + "Z=0 S=1 O=0", + "Z=0 S=1 O=1", + "Z=1 S=0 O=0", + "Z=1 S=0 O=1", + "Z=1 S=1 O=0", + "Z=1 S=1 O=1"}; + +char *cc_name(cc_t c) +{ + int ci = c; + if (ci < 0 || ci > 7) + return "???????????"; + else + return cc_names[c]; +} + +/* Status types */ + +char *stat_names[] = { "BUB", "AOK", "HLT", "ADR", "INS", "PIP" }; + +char *stat_name(stat_t e) +{ + if (e < 0 || e > STAT_PIP) + return "Invalid Status"; + return stat_names[e]; +} + +/**************** Implementation of ISA model ************************/ + +state_ptr new_state(int memlen) +{ + state_ptr result = (state_ptr) malloc(sizeof(state_rec)); + result->pc = 0; + result->r = init_reg(); + result->m = init_mem(memlen); + result->cc = DEFAULT_CC; + return result; +} + +void free_state(state_ptr s) +{ + free_reg(s->r); + free_mem(s->m); + free((void *) s); +} + +state_ptr copy_state(state_ptr s) { + state_ptr result = (state_ptr) malloc(sizeof(state_rec)); + result->pc = s->pc; + result->r = copy_reg(s->r); + result->m = copy_mem(s->m); + result->cc = s->cc; + return result; +} + +bool_t diff_state(state_ptr olds, state_ptr news, FILE *outfile) { + bool_t diff = FALSE; + + if (olds->pc != news->pc) { + diff = TRUE; + if (outfile) { + fprintf(outfile, "pc:\t0x%.16llx\t0x%.16llx\n", olds->pc, news->pc); + } + } + if (olds->cc != news->cc) { + diff = TRUE; + if (outfile) { + fprintf(outfile, "cc:\t%s\t%s\n", cc_name(olds->cc), cc_name(news->cc)); + } + } + if (diff_reg(olds->r, news->r, outfile)) + diff = TRUE; + if (diff_mem(olds->m, news->m, outfile)) + diff = TRUE; + return diff; +} + + +/* Branch logic */ +bool_t cond_holds(cc_t cc, cond_t bcond) { + bool_t zf = GET_ZF(cc); + bool_t sf = GET_SF(cc); + bool_t of = GET_OF(cc); + bool_t jump = FALSE; + + switch(bcond) { + case C_YES: + jump = TRUE; + break; + case C_LE: + jump = (sf^of)|zf; + break; + case C_L: + jump = sf^of; + break; + case C_E: + jump = zf; + break; + case C_NE: + jump = zf^1; + break; + case C_GE: + jump = sf^of^1; + break; + case C_G: + jump = (sf^of^1)&(zf^1); + break; + default: + jump = FALSE; + break; + } + return jump; +} + + +/* Execute single instruction. Return status. */ +stat_t step_state(state_ptr s, FILE *error_file) +{ + word_t argA, argB; + byte_t byte0 = 0; + byte_t byte1 = 0; + itype_t hi0; + alu_t lo0; + reg_id_t hi1 = REG_NONE; + reg_id_t lo1 = REG_NONE; + bool_t ok1 = TRUE; + word_t cval = 0; + word_t okc = TRUE; + word_t val, dval; + bool_t need_regids; + bool_t need_imm; + word_t ftpc = s->pc; /* Fall-through PC */ + + if (!get_byte_val(s->m, ftpc, &byte0)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + ftpc++; + + hi0 = HI4(byte0); + lo0 = LO4(byte0); + + need_regids = + (hi0 == I_RRMOVQ || hi0 == I_ALU || hi0 == I_PUSHQ || + hi0 == I_POPQ || hi0 == I_IRMOVQ || hi0 == I_RMMOVQ || + hi0 == I_MRMOVQ || hi0 == I_IADDQ); + + if (need_regids) { + ok1 = get_byte_val(s->m, ftpc, &byte1); + ftpc++; + hi1 = HI4(byte1); + lo1 = LO4(byte1); + } + + need_imm = + (hi0 == I_IRMOVQ || hi0 == I_RMMOVQ || hi0 == I_MRMOVQ || + hi0 == I_JMP || hi0 == I_CALL || hi0 == I_IADDQ); + + if (need_imm) { + okc = get_word_val(s->m, ftpc, &cval); + ftpc += 8; + } + + switch (hi0) { + case I_NOP: + s->pc = ftpc; + break; + case I_HALT: + return STAT_HLT; + break; + case I_RRMOVQ: /* Both unconditional and conditional moves */ + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!reg_valid(hi1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", + s->pc, hi1); + return STAT_INS; + } + if (!reg_valid(lo1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", + s->pc, lo1); + return STAT_INS; + } + val = get_reg_val(s->r, hi1); + if (cond_holds(s->cc, lo0)) + set_reg_val(s->r, lo1, val); + s->pc = ftpc; + break; + case I_IRMOVQ: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!okc) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address", + s->pc); + return STAT_INS; + } + if (!reg_valid(lo1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", + s->pc, lo1); + return STAT_INS; + } + set_reg_val(s->r, lo1, cval); + s->pc = ftpc; + break; + case I_RMMOVQ: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!okc) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_INS; + } + if (!reg_valid(hi1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", + s->pc, hi1); + return STAT_INS; + } + if (reg_valid(lo1)) + cval += get_reg_val(s->r, lo1); + val = get_reg_val(s->r, hi1); + if (!set_word_val(s->m, cval, val)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid data address 0x%llx\n", + s->pc, cval); + return STAT_ADR; + } + s->pc = ftpc; + break; + case I_MRMOVQ: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!okc) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction addres\n", s->pc); + return STAT_INS; + } + if (!reg_valid(hi1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", + s->pc, hi1); + return STAT_INS; + } + if (reg_valid(lo1)) + cval += get_reg_val(s->r, lo1); + if (!get_word_val(s->m, cval, &val)) + return STAT_ADR; + set_reg_val(s->r, hi1, val); + s->pc = ftpc; + break; + case I_ALU: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + argA = get_reg_val(s->r, hi1); + argB = get_reg_val(s->r, lo1); + val = compute_alu(lo0, argA, argB); + set_reg_val(s->r, lo1, val); + s->cc = compute_cc(lo0, argA, argB); + s->pc = ftpc; + break; + case I_JMP: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!okc) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (cond_holds(s->cc, lo0)) + s->pc = cval; + else + s->pc = ftpc; + break; + case I_CALL: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!okc) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + val = get_reg_val(s->r, REG_RSP) - 8; + set_reg_val(s->r, REG_RSP, val); + if (!set_word_val(s->m, val, ftpc)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid stack address 0x%llx\n", s->pc, val); + return STAT_ADR; + } + s->pc = cval; + break; + case I_RET: + /* Return Instruction. Pop address from stack */ + dval = get_reg_val(s->r, REG_RSP); + if (!get_word_val(s->m, dval, &val)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid stack address 0x%llx\n", + s->pc, dval); + return STAT_ADR; + } + set_reg_val(s->r, REG_RSP, dval + 8); + s->pc = val; + break; + case I_PUSHQ: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!reg_valid(hi1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", s->pc, hi1); + return STAT_INS; + } + val = get_reg_val(s->r, hi1); + dval = get_reg_val(s->r, REG_RSP) - 8; + set_reg_val(s->r, REG_RSP, dval); + if (!set_word_val(s->m, dval, val)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid stack address 0x%llx\n", s->pc, dval); + return STAT_ADR; + } + s->pc = ftpc; + break; + case I_POPQ: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!reg_valid(hi1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", s->pc, hi1); + return STAT_INS; + } + dval = get_reg_val(s->r, REG_RSP); + set_reg_val(s->r, REG_RSP, dval+8); + if (!get_word_val(s->m, dval, &val)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid stack address 0x%llx\n", + s->pc, dval); + return STAT_ADR; + } + set_reg_val(s->r, hi1, val); + s->pc = ftpc; + break; + case I_IADDQ: + if (!ok1) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address\n", s->pc); + return STAT_ADR; + } + if (!okc) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction address", + s->pc); + return STAT_INS; + } + if (!reg_valid(lo1)) { + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid register ID 0x%.1x\n", + s->pc, lo1); + return STAT_INS; + } + argB = get_reg_val(s->r, lo1); + val = argB + cval; + set_reg_val(s->r, lo1, val); + s->cc = compute_cc(A_ADD, cval, argB); + s->pc = ftpc; + break; + default: + if (error_file) + fprintf(error_file, + "PC = 0x%llx, Invalid instruction %.2x\n", s->pc, byte0); + return STAT_INS; + } + return STAT_AOK; +} diff --git a/arch/sim/misc/isa.h b/arch/sim/misc/isa.h new file mode 100644 index 0000000..3c8adb9 --- /dev/null +++ b/arch/sim/misc/isa.h @@ -0,0 +1,210 @@ +/* Instruction Set definition for Y86-64 Architecture */ +/* Revisions: + 2013-10-25: + Extended all data widths and addresses to 64 bits + Changed all 'l' instructions to 'q' + Changed registers name from e-form to r-form + Added registers %r8 to %r14 + 2009-03-11: + Changed RNONE to be 0xF + Changed J_XX and jump_t to C_XX and cond_t; take_branch to cond_holds + Expanded RRMOVL to include conditional moves +*/ + +/**************** Registers *************************/ + +/* REG_NONE is a special one to indicate no register */ +typedef enum { REG_RAX, REG_RCX, REG_RDX, REG_RBX, + REG_RSP, REG_RBP, REG_RSI, REG_RDI, + REG_R8, REG_R9, REG_R10, REG_R11, + REG_R12, REG_R13, REG_R14, REG_NONE=0xF, REG_ERR } reg_id_t; + +/* Find register ID given its name */ +reg_id_t find_register(char *name); +/* Return name of register given its ID */ +char *reg_name(reg_id_t id); + +/**************** Instruction Encoding **************/ + +/* Different argument types */ +typedef enum { R_ARG, M_ARG, I_ARG, NO_ARG } arg_t; + +/* Different instruction types */ +typedef enum { I_HALT, I_NOP, I_RRMOVQ, I_IRMOVQ, I_RMMOVQ, I_MRMOVQ, + I_ALU, I_JMP, I_CALL, I_RET, I_PUSHQ, I_POPQ, + I_IADDQ, I_POP2 } itype_t; + +/* Different ALU operations */ +typedef enum { A_ADD, A_SUB, A_AND, A_XOR, A_NONE } alu_t; + +/* Default function code */ +typedef enum { F_NONE } fun_t; + +/* Return name of operation given its ID */ +char op_name(alu_t op); + +/* Different Jump conditions */ +typedef enum { C_YES, C_LE, C_L, C_E, C_NE, C_GE, C_G } cond_t; + +/* Pack itype and function into single byte */ +#define HPACK(hi,lo) ((((hi)&0xF)<<4)|((lo)&0xF)) + +/* Unpack byte */ +#define HI4(byte) (((byte)>>4)&0xF) +#define LO4(byte) ((byte)&0xF) + +/* Get the opcode out of one byte instruction field */ +#define GET_ICODE(instr) HI4(instr) + +/* Get the ALU/JMP function out of one byte instruction field */ +#define GET_FUN(instr) LO4(instr) + +/* Return name of instruction given it's byte encoding */ +char *iname(int instr); + +/**************** Truth Values **************/ +typedef enum { FALSE, TRUE } bool_t; + +/* Table used to encode information about instructions */ +typedef struct { + char *name; + unsigned char code; /* Byte code for instruction+op */ + int bytes; + arg_t arg1; + int arg1pos; + int arg1hi; /* 0/1 for register argument, # bytes for allocation */ + arg_t arg2; + int arg2pos; + int arg2hi; /* 0/1 */ +} instr_t, *instr_ptr; + +instr_ptr find_instr(char *name); + +/* Return invalid instruction for error handling purposes */ +instr_ptr bad_instr(); + +/*********** Implementation of Memory *****************/ +typedef unsigned char byte_t; +typedef long long int word_t; +typedef long long unsigned uword_t; + +/* Represent a memory as an array of bytes */ +typedef struct { + int len; + word_t maxaddr; + byte_t *contents; +} mem_rec, *mem_t; + +/* Create a memory with len bytes */ +mem_t init_mem(int len); +void free_mem(mem_t m); + +/* Set contents of memory to 0 */ +void clear_mem(mem_t m); + +/* Make a copy of a memory */ +mem_t copy_mem(mem_t oldm); +/* Print the differences between two memories */ +bool_t diff_mem(mem_t oldm, mem_t newm, FILE *outfile); + +/* How big should the memory be? */ +#ifdef BIG_MEM +#define MEM_SIZE (1<<16) +#else +#define MEM_SIZE (1<<13) +#endif + +/*** In the following functions, a return value of 1 means success ***/ + +/* Load memory from .yo file. Return number of bytes read */ +int load_mem(mem_t m, FILE *infile, int report_error); + +/* Get byte from memory */ +bool_t get_byte_val(mem_t m, word_t pos, byte_t *dest); + +/* Get 8 bytes from memory */ +bool_t get_word_val(mem_t m, word_t pos, word_t *dest); + +/* Set byte in memory */ +bool_t set_byte_val(mem_t m, word_t pos, byte_t val); + +/* Set 8 bytes in memory */ +bool_t set_word_val(mem_t m, word_t pos, word_t val); + +/* Print contents of memory */ +void dump_memory(FILE *outfile, mem_t m, word_t pos, int cnt); + +/********** Implementation of Register File *************/ + +mem_t init_reg(); +void free_reg(mem_t t); + +/* Make a copy of a register file */ +mem_t copy_reg(mem_t oldr); +/* Print the differences between two register files */ +bool_t diff_reg(mem_t oldr, mem_t newr, FILE *outfile); + + +word_t get_reg_val(mem_t r, reg_id_t id); +void set_reg_val(mem_t r, reg_id_t id, word_t val); +void dump_reg(FILE *outfile, mem_t r); + + + +/* **************** ALU Function **********************/ + +/* Compute ALU operation */ +word_t compute_alu(alu_t op, word_t arg1, word_t arg2); + +typedef unsigned char cc_t; + +#define GET_ZF(cc) (((cc) >> 2)&0x1) +#define GET_SF(cc) (((cc) >> 1)&0x1) +#define GET_OF(cc) (((cc) >> 0)&0x1) + +#define PACK_CC(z,s,o) (((z)<<2)|((s)<<1)|((o)<<0)) + +#define DEFAULT_CC PACK_CC(1,0,0) + +/* Compute condition code. */ +cc_t compute_cc(alu_t op, word_t arg1, word_t arg2); + +/* Generated printed form of condition code */ +char *cc_name(cc_t c); + +/* **************** Status types *******************/ + +typedef enum + {STAT_BUB, STAT_AOK, STAT_HLT, STAT_ADR, STAT_INS, STAT_PIP } stat_t; + +/* Describe Status */ +char *stat_name(stat_t e); + +/* **************** ISA level implementation *********/ + +typedef struct { + word_t pc; + mem_t r; + mem_t m; + cc_t cc; +} state_rec, *state_ptr; + +state_ptr new_state(int memlen); +void free_state(state_ptr s); + +state_ptr copy_state(state_ptr s); +bool_t diff_state(state_ptr olds, state_ptr news, FILE *outfile); + +/* Determine if condition satisified */ +bool_t cond_holds(cc_t cc, cond_t bcond); + +/* Execute single instruction. Return status. */ +stat_t step_state(state_ptr s, FILE *error_file); + +/************************ Interface Functions *************/ + +#ifdef HAS_GUI +void report_line(word_t line_no, word_t addr, char *hexcode, char *line); +void signal_register_update(reg_id_t r, word_t val); + +#endif diff --git a/arch/sim/misc/mux4.hcl b/arch/sim/misc/mux4.hcl new file mode 100644 index 0000000..6e14466 --- /dev/null +++ b/arch/sim/misc/mux4.hcl @@ -0,0 +1,57 @@ +#/* $begin sim-mux4-raw-hcl */ +## Simple example of an HCL file. +## This file can be converted to C using hcl2c, and then compiled. + +## In this example, we will generate the MUX4 circuit shown in +## Section SLASHrefLBRACKsect:arch:hclsetRBRACK. It consists of a control block that generates +## bit-level signals s1 and s0 from the input signal code, +## and then uses these signals to control a 4-way multiplexor +## with data inputs A, B, C, and D. + +## This code is embedded in a C program that reads +## the values of code, A, B, C, and D from the command line +## and then prints the circuit output + +## Information that is inserted verbatim into the C file +quote '#include ' +quote '#include ' +quote 'long long code_val, s0_val, s1_val;' +quote 'char **data_names;' + +## Declarations of signals used in the HCL description and +## the corresponding C expressions. +boolsig s0 's0_val' +boolsig s1 's1_val' +wordsig code 'code_val' +wordsig A 'atoll(data_names[0])' +wordsig B 'atoll(data_names[1])' +wordsig C 'atoll(data_names[2])' +wordsig D 'atoll(data_names[3])' + +## HCL descriptions of the logic blocks +quote '/* $begin sim-mux4-s1-c */' +bool s1 = code in { 2, 3 }; +quote '/* $end sim-mux4-s1-c */' + +bool s0 = code in { 1, 3 }; + +word Out4 = [ + !s1 && !s0 : A; # 00 + !s1 : B; # 01 + !s0 : C; # 10 + 1 : D; # 11 +]; + +## More information inserted verbatim into the C code to +## compute the values and print the output +quote '/* $begin sim-mux4-main-c */' +quote 'int main(int argc, char *argv[]) {' +quote ' data_names = argv+2;' +quote ' code_val = atoll(argv[1]);' +quote ' s1_val = gen_s1();' +quote ' s0_val = gen_s0();' +quote ' printf("Out = %lld\n", gen_Out4());' +quote ' return 0;' +quote '}' +quote '/* $end sim-mux4-main-c */' +#/* $end sim-mux4-raw-hcl */ diff --git a/arch/sim/misc/node.c b/arch/sim/misc/node.c new file mode 100644 index 0000000..1f35938 --- /dev/null +++ b/arch/sim/misc/node.c @@ -0,0 +1,703 @@ +/* Functions to generate C or Verilog code from HCL */ +/* This file maintains a parse tree representation of expressions */ + +#include +#include +#include +#include +#include + +#include "node.h" +#include "outgen.h" + +#define MAXBUF 1024 + +void yyerror(const char *str); +void yyserror(const char *str, char *other); + +/* For error reporting */ +static char* show_expr(node_ptr expr); + +/* The symbol table */ +#define SYM_LIM 100 +static node_ptr sym_tab[2][SYM_LIM]; +static int sym_count = 0; + +/* Optional simulator name */ +char simname[MAXBUF] = ""; + +#ifdef UCLID +int annotate = 0; +/* Keep list of argument names encountered in node definition */ +char *arg_names[SYM_LIM]; +int arg_cnt = 0; +#endif + + +extern FILE *outfile; + +/* + * usage - print helpful diagnostic information + */ +static void usage(char *name) +{ +#ifdef VLOG + fprintf(stderr, "Usage: %s [-h] < HCL_file > verilog_file\n", name); +#else +#ifdef UCLID + fprintf(stderr, "Usage: %s [-ah] < HCL_file > uclid_file\n", name); + fprintf(stderr, " -a Add define/use annotations\n"); +#else /* !UCLID */ + fprintf(stderr, "Usage: %s [-h][-n NAM] < HCL_file > C_file\n", name); +#endif /* UCLID */ +#endif /* VLOG */ + fprintf(stderr, " -h Print this message\n"); + fprintf(stderr, " -n NAM Specify processor name\n"); + exit(0); +} + + +/* Initialization */ +void init_node(int argc, char **argv) +{ + int c; + int max_column = 75; + int first_indent = 4; + int other_indents = 2; + + /* Parse the command line arguments */ + while ((c = getopt(argc, argv, "hna")) != -1) { + switch(c) { + case 'h': + usage(argv[0]); + break; + case 'n': /* Optional simulator name */ + strcpy(simname, argv[optind]); + break; +#ifdef UCLID + case 'a': + annotate = 1; + break; +#endif + default: + printf("Invalid option '%c'\n", c); + usage(argv[0]); + break; + } + } + +#if !defined(VLOG) && !defined(UCLID) + /* Define and initialize the simulator name */ + if (!strcmp(simname, "")) + printf("char simname[] = \"Y86-64 Processor\";\n"); + else + printf("char simname[] = \"Y86-64 Processor: %s\";\n", simname); +#endif + outgen_init(outfile, max_column, first_indent, other_indents); +} + +static void add_symbol(node_ptr name, node_ptr val) +{ + if (sym_count >= SYM_LIM) { + yyerror("Symbol table limit exceeded"); + return; + } + sym_tab[0][sym_count] = name; + sym_tab[1][sym_count] = val; + sym_count++; +} + + +static char *node_names[] = + {"quote", "var", "num", "and", "or", "not", "comp", "ele", "case"}; + +static void show_node(node_ptr node) +{ + printf("Node type: %s, Boolean ? %c, String value: %s\n", + node_names[node->type], node->isbool ? 'Y':'N', node->sval); +} + + +void finish_node(int check_ref) +{ + if (check_ref) { + int i; + for (i = 0; i < sym_count; i++) + if (!sym_tab[0][i]->ref) { + fprintf(stderr, "Warning, argument '%s' not referenced\n", + sym_tab[0][i]->sval); + } + } +} + +static node_ptr find_symbol(char *name) +{ + int i; + for (i = 0; i < sym_count; i++) { + if (strcmp(name, sym_tab[0][i]->sval) == 0) { + node_ptr result = sym_tab[1][i]; + sym_tab[0][i]->ref++; + return result; + } + } + yyserror("Symbol %s not found", name); + return NULL; +} + +#ifdef UCLID +/* See if string should be considered argument. + Currently, omit strings that are all upper case */ +static int is_arg(char *name) +{ + int upper = 1; + int c; + while ((c=*name++) != '\0') + upper = upper && isupper(c); + return !upper; +} + +/* See if string is part of current argument list */ +static void check_for_arg(char *name) +{ + int i; + if (!is_arg(name)) + return; + for (i = 0; i < arg_cnt; i++) + if (strcmp(arg_names[i], name) == 0) + return; + arg_names[arg_cnt++] = name; +} +#endif + +static node_ptr new_node(node_type_t t, int isbool, + char *s, node_ptr a1, node_ptr a2) +{ + node_ptr result = malloc(sizeof(node_rec)); + result->type = t; + result->isbool = isbool; + result->sval = s; + result->arg1 = a1; + result->arg2 = a2; + result->ref = 0; + result->next = NULL; + return result; +} + +/* Concatenate two lists */ +node_ptr concat(node_ptr n1, node_ptr n2) +{ + node_ptr tail = n1; + if (!n1) + return n2; + while (tail->next) + tail = tail->next; + tail->next = n2; + return n1; +} + +static void free_node(node_ptr n) +{ + free(n->sval); + free(n); +} + +node_ptr make_quote(char *qstring) +{ + + /* Quoted string still has quotes around it */ + int len = strlen(qstring)-2; + char *sname = malloc(len+1); + strncpy(sname, qstring+1, len); + sname[len] = '\0'; + return new_node(N_QUOTE, 0, sname, NULL, NULL); +} + +node_ptr make_var(char *name) +{ + char *sname = malloc(strlen(name)+1); + strcpy(sname, name); + /* Initially assume var is not Boolean */ + return new_node(N_VAR, 0, sname, NULL, NULL); +} + +node_ptr make_num(char *name) +{ + char *sname = malloc(strlen(name)+1); + strcpy(sname, name); + return new_node(N_NUM, 0, sname, NULL, NULL); +} + +void set_bool(node_ptr varnode) +{ + if (!varnode) + yyerror("Null node encountered"); + varnode->isbool = 1; +} + +/* Make sure argument is OK */ +static int check_arg(node_ptr arg, int wantbool) +{ + if (!arg) { + yyerror("Null node encountered"); + return 0; + } + if (arg->type == N_VAR) { + node_ptr qval = find_symbol(arg->sval); + if (!qval) { + yyserror("Variable '%s' not found", arg->sval); + return 0; + } + if (wantbool != qval->isbool) { + if (wantbool) + yyserror("Variable '%s' not Boolean", arg->sval); + else + yyserror("Variable '%s' not integer", arg->sval); + return 0; + } + return 1; + } + if (arg->type == N_NUM) { + if (wantbool && strcmp(arg->sval,"0") != 0 && + strcmp(arg->sval,"1") != 0) { + yyserror("Value '%s' not Boolean", arg->sval); + return 0; + } + return 1; + } + if (wantbool && !arg->isbool) + yyserror("Non Boolean argument '%s'", show_expr(arg)); + if (!wantbool && arg->isbool) + yyserror("Non integer argument '%s'", show_expr(arg)); + return (wantbool == arg->isbool); +} + +node_ptr make_not(node_ptr arg) +{ + check_arg(arg, 1); + return new_node(N_NOT, 1, "!", arg, NULL); +} + +node_ptr make_and(node_ptr arg1, node_ptr arg2) +{ + check_arg(arg1, 1); + check_arg(arg2, 1); + return new_node(N_AND, 1, "&", arg1, arg2); +} + +node_ptr make_or(node_ptr arg1, node_ptr arg2) +{ + check_arg(arg1, 1); + check_arg(arg2, 1); + return new_node(N_OR, 1, "|", arg1, arg2); +} + +node_ptr make_comp(node_ptr op, node_ptr arg1, node_ptr arg2) +{ + check_arg(arg1, 0); + check_arg(arg2, 0); + return new_node(N_COMP, 1, op->sval, arg1, arg2); +} + +node_ptr make_ele(node_ptr arg1, node_ptr arg2) +{ + node_ptr ele; + check_arg(arg1, 0); + for (ele = arg1; ele; ele = ele->next) + check_arg(ele, 0); + return new_node(N_ELE, 1, "in", arg1, arg2); +} + +node_ptr make_case(node_ptr arg1, node_ptr arg2) +{ + check_arg(arg1, 1); + check_arg(arg2, 0); + return new_node(N_CASE, 0, ":", arg1, arg2); +} + +void insert_code(node_ptr qstring) +{ + if (!qstring) + yyerror("Null node"); + else { +#if !defined(VLOG) && !defined(UCLID) + fputs(qstring->sval, outfile); + fputs("\n", outfile); +#endif + } +} + +void add_arg(node_ptr var, node_ptr qstring, int isbool) +{ + if (!var || !qstring) { + yyerror("Null node"); + return; + } + add_symbol(var, qstring); + if (isbool) { + set_bool(var); + set_bool(qstring); + } +} + +static char expr_buf[1024]; +static int errlen = 0; +#define MAXERRLEN 80 + +/* Recursively display expression for error reporting */ +static void show_expr_helper(node_ptr expr) +{ + switch(expr->type) { + int len; + node_ptr ele; + case N_QUOTE: + len = strlen(expr->sval) + 2; + if (len + errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "'%s'", expr->sval); + errlen += len; + } + break; + case N_VAR: + len = strlen(expr->sval); + if (len + errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "%s", expr->sval); + errlen += len; + } + break; + case N_NUM: + len = strlen(expr->sval); + if (len + errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "%s", expr->sval); + errlen += len; + } + break; + case N_AND: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "("); + errlen+=1; + show_expr_helper(expr->arg1); + sprintf(expr_buf+errlen, " & "); + errlen+=3; + } + if (errlen < MAXERRLEN) { + show_expr_helper(expr->arg2); + sprintf(expr_buf+errlen, ")"); + errlen+=1; + } + break; + case N_OR: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "("); + errlen+=1; + show_expr_helper(expr->arg1); + sprintf(expr_buf+errlen, " | "); + errlen+=3; + } + if (errlen < MAXERRLEN) { + show_expr_helper(expr->arg2); + sprintf(expr_buf+errlen, ")"); + errlen+=1; + } + break; + case N_NOT: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "!"); + errlen+=1; + show_expr_helper(expr->arg1); + } + break; + case N_COMP: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "("); + errlen+=1; + show_expr_helper(expr->arg1); + sprintf(expr_buf+errlen, " %s ", expr->sval); + errlen+=4; + } + if (errlen < MAXERRLEN) { + show_expr_helper(expr->arg2); + sprintf(expr_buf+errlen, ")"); + errlen+=1; + } + break; + case N_ELE: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "("); + errlen+=1; + show_expr_helper(expr->arg1); + sprintf(expr_buf+errlen, " in {"); + errlen+=5; + } + for (ele = expr->arg2; ele; ele=ele->next) { + if (errlen < MAXERRLEN) { + show_expr_helper(ele); + if (ele->next) { + sprintf(expr_buf+errlen, ", "); + errlen+=2; + } + } + } + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "})"); + errlen+=2; + } + break; + case N_CASE: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "[ "); + errlen+=2; + } + for (ele = expr; errlen < MAXERRLEN && ele; ele=ele->next) { + show_expr_helper(ele->arg1); + sprintf(expr_buf+errlen, " : "); + errlen += 3; + show_expr_helper(ele->arg2); + } + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, " ]"); + errlen+=2; + } + break; + default: + if (errlen < MAXERRLEN) { + sprintf(expr_buf+errlen, "??"); + errlen+=2; + } + break; + } +} + +static char *show_expr(node_ptr expr) +{ + errlen = 0; + show_expr_helper(expr); + if (errlen >= MAXERRLEN) + sprintf(expr_buf+errlen, "..."); + return expr_buf; +} + +/* Recursively generate code for function */ +static void gen_expr(node_ptr expr) +{ + node_ptr ele; + switch(expr->type) { + case N_QUOTE: + yyserror("Unexpected quoted string", expr->sval); + break; + case N_VAR: + { + node_ptr qstring = find_symbol(expr->sval); + if (qstring) +#if defined(VLOG) || defined(UCLID) + outgen_print("%s", expr->sval); +#else + outgen_print("(%s)", qstring->sval); +#endif + else + yyserror("Invalid variable '%s'", expr->sval); +#ifdef UCLID + check_for_arg(expr->sval); +#endif + + } + break; + case N_NUM: +#ifdef UCLID + { + long long int val = atoll(expr->sval); + if (val < -1) + outgen_print("pred^%d(CZERO)", -val); + else if (val == -1) + outgen_print("pred(CZERO)"); + else if (val == 0) + outgen_print("CZERO"); + else if (val == 1) + outgen_print("succ(CZERO)"); + else + outgen_print("succ^%d(CZERO)", val); + } +#else /* !UCLID */ + fputs(expr->sval, outfile); +#endif /* UCLID */ + break; + case N_AND: + outgen_print("("); + outgen_upindent(); + gen_expr(expr->arg1); + outgen_print(" & "); + gen_expr(expr->arg2); + outgen_print(")"); + outgen_downindent(); + break; + case N_OR: + outgen_print("("); + outgen_upindent(); + gen_expr(expr->arg1); + outgen_print(" | "); + gen_expr(expr->arg2); + outgen_print(")"); + outgen_downindent(); + break; + case N_NOT: +#if defined(VLOG) || defined(UCLID) + outgen_print("~"); +#else + outgen_print("!"); +#endif + gen_expr(expr->arg1); + break; + case N_COMP: + outgen_print("("); + outgen_upindent(); + gen_expr(expr->arg1); +#ifdef UCLID + { + char *cval = expr->sval; + if (strcmp(cval, "==") == 0) + cval = "="; + outgen_print(" %s ", cval); + } +#else /* !UCLID */ + outgen_print(" %s ", expr->sval); +#endif /* UCLID */ + gen_expr(expr->arg2); + outgen_print(")"); + outgen_downindent(); + break; + case N_ELE: + outgen_print("("); + outgen_upindent(); + for (ele = expr->arg2; ele; ele=ele->next) { + gen_expr(expr->arg1); +#ifdef UCLID + outgen_print(" = "); +#else + outgen_print(" == "); +#endif + gen_expr(ele); + if (ele->next) +#if defined(VLOG) || defined(UCLID) + outgen_print(" | "); +#else + outgen_print(" || "); +#endif + } + outgen_print(")"); + outgen_downindent(); + break; + case N_CASE: +#ifdef UCLID + outgen_print("case"); + outgen_terminate(); + { + /* Use this to keep track of last case when no default is given */ + node_ptr last_arg2 = NULL; + for (ele = expr; ele; ele=ele->next) { + outgen_print(" "); + if (ele->arg1->type == N_NUM && atoll(ele->arg1->sval) == 1) { + outgen_print("default"); + last_arg2 = NULL; + } + else { + gen_expr(ele->arg1); + last_arg2 = ele->arg2; + } + outgen_print(" : "); + gen_expr(ele->arg2); + outgen_print(";"); + outgen_terminate(); + } + if (last_arg2) { + /* Use final case as default */ + outgen_print(" default : "); + gen_expr(last_arg2); + outgen_print(";"); + outgen_terminate(); + } + } + outgen_print(" esac"); +#else /* !UCLID */ + outgen_print("("); + outgen_upindent(); + int done = 0; + for (ele = expr; ele && !done; ele=ele->next) { + if (ele->arg1->type == N_NUM && atoll(ele->arg1->sval) == 1) { + gen_expr(ele->arg2); + done = 1; + } else { + gen_expr(ele->arg1); + outgen_print(" ? "); + gen_expr(ele->arg2); + outgen_print(" : "); + } + } + if (!done) + outgen_print("0"); + outgen_print(")"); + outgen_downindent(); +#endif + break; + default: + yyerror("Unknown node type"); + break; + } +} + + +/* Generate code defining function for var */ +void gen_funct(node_ptr var, node_ptr expr, int isbool) +{ + if (!var || !expr) { + yyerror("Null node"); + return; + } + check_arg(expr, isbool); +#ifdef VLOG + outgen_print("assign %s = ", var->sval); + outgen_terminate(); + outgen_print(" "); + gen_expr(expr); + outgen_print(";"); + outgen_terminate(); + outgen_terminate(); +#else /* !VLOG */ +#ifdef UCLID + if (annotate) { + /* Print annotation information*/ + outgen_print("(* $define %s *)", var->sval); + outgen_terminate(); + } + outgen_print("%s := ", var->sval); + outgen_terminate(); + outgen_print(" "); + if (isbool && expr->type == N_NUM) { + outgen_print("%d", atoll(var->sval)); + } else + gen_expr(expr); + outgen_print(";"); + outgen_terminate(); + if (annotate) { + int i; + outgen_print("(* $args"); + for (i = 0; i < arg_cnt; i++) + outgen_print("%c%s", i == 0 ? ' ' : ':', arg_names[i]); + outgen_print(" *)"); + outgen_terminate(); + arg_cnt = 0; + } + outgen_terminate(); +#else /* !UCLID */ + /* Print function header */ + outgen_print("long long gen_%s()", var->sval); + outgen_terminate(); + outgen_print("{"); + outgen_terminate(); + outgen_print(" return "); + gen_expr(expr); + outgen_print(";"); + outgen_terminate(); + outgen_print("}"); + outgen_terminate(); + outgen_terminate(); +#endif /* UCLID */ +#endif /* VLOG */ +} diff --git a/arch/sim/misc/node.h b/arch/sim/misc/node.h new file mode 100644 index 0000000..b362592 --- /dev/null +++ b/arch/sim/misc/node.h @@ -0,0 +1,35 @@ +#ifndef NODE_H +typedef enum { N_QUOTE, N_VAR, N_NUM, N_AND, N_OR, N_NOT, N_COMP, N_ELE, N_CASE } node_type_t; + +typedef struct NODE { + node_type_t type; + int isbool; /* Is this node a Boolean expression? */ + char *sval; + struct NODE *arg1; + struct NODE *arg2; + int ref; /* For var, how many times has it been referenced? */ + struct NODE *next; +} node_rec, *node_ptr; + +void init_node(int argc, char **argv); +void finish_node(int check_ref); + +node_ptr make_quote(char *qstring); +node_ptr make_var(char *name); +node_ptr make_num(char *name); +void set_bool(node_ptr varnode); +node_ptr make_not(node_ptr arg); +node_ptr make_and(node_ptr arg1, node_ptr arg2); +node_ptr make_or(node_ptr arg1, node_ptr arg2); +node_ptr make_comp(node_ptr op, node_ptr arg1, node_ptr arg2); +node_ptr make_ele(node_ptr arg1, node_ptr arg2); +node_ptr make_case(node_ptr arg1, node_ptr arg2); + +node_ptr concat(node_ptr n1, node_ptr n2); + +void insert_code(node_ptr qstring); +void add_arg(node_ptr var, node_ptr qstring, int isbool); +void gen_funct(node_ptr var, node_ptr expr, int isbool); +#define NODE_H +#endif + diff --git a/arch/sim/misc/outgen.c b/arch/sim/misc/outgen.c new file mode 100644 index 0000000..e51c65f --- /dev/null +++ b/arch/sim/misc/outgen.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include + +#include "outgen.h" +/* Output generator that ensures no line exceeds specified number of columns */ + +#define STRING_LENGTH 1024 + +FILE *outfile = NULL; +int max_column = 80; +int first_indent = 4; +int other_indents = 2; +int cur_pos = 0; +int indent = 0; + + +/* Controlling parameters */ +void outgen_init(FILE *arg_outfile, int arg_max_column, int arg_first_indent, int arg_other_indents) { + outfile = arg_outfile; + max_column = arg_max_column; + first_indent = arg_first_indent; + other_indents = arg_other_indents; + cur_pos = 0; + indent = first_indent; +} + +static void print_token(char *string) { + if (outfile == NULL) + outfile = stdout; + int len = strlen(string); + int i; + if (len+cur_pos > max_column) { + fprintf(outfile, "\n"); + for (i = 0; i < indent; i++) + fprintf(outfile, " "); + cur_pos = indent; + } + fprintf(outfile, "%s", string); + cur_pos += len; +} + + +/* Terminate statement and reset indentations */ +void outgen_terminate() { + printf("\n"); + cur_pos = 0; + indent = first_indent; +} + +/* Output generator printing */ +void outgen_print(char *fmt, ...) { + char buf[STRING_LENGTH]; + va_list argp; + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + print_token(buf); +} + +/* Increase indentation level */ +void outgen_upindent() { + indent += other_indents; +} +/* Decrease indentation level */ +void outgen_downindent() { + indent -= other_indents; +} + + diff --git a/arch/sim/misc/outgen.h b/arch/sim/misc/outgen.h new file mode 100644 index 0000000..1a48702 --- /dev/null +++ b/arch/sim/misc/outgen.h @@ -0,0 +1,18 @@ +/* Output generator that ensures no line exceeds specified number of columns */ + +/* Controlling parameters */ +void outgen_init(FILE *outfile, int max_column, int first_indent, int other_indents); + +/* Terminate statement and reset indentations */ +void outgen_terminate(); + +/* Output generator printing */ +void outgen_print(char *fmt, ...); + +/* Increase indentation level */ +void outgen_upindent(); +/* Decrease indentation level */ +void outgen_downindent(); + + + diff --git a/arch/sim/misc/rsum.ys b/arch/sim/misc/rsum.ys new file mode 100644 index 0000000..2d9c48b --- /dev/null +++ b/arch/sim/misc/rsum.ys @@ -0,0 +1,37 @@ + .pos 0 + irmovq stack, %rsp + call main + halt + +# Sample linked list + .align 8 +ele1: + .quad 0x00a + .quad ele2 +ele2: + .quad 0x0b0 + .quad ele3 +ele3: + .quad 0xc00 + .quad 0 + +main: + irmovq ele1, %rdi + call rsum_list + ret + +rsum_list: + xorq %rax, %rax + andq %rdi, %rdi + je end + pushq %rdi + mrmovq 8(%rdi), %rdi + call rsum_list + popq %rdi + mrmovq (%rdi), %rsi + addq %rsi, %rax +end: + ret + + .pos 0x200 +stack: diff --git a/arch/sim/misc/sum.ys b/arch/sim/misc/sum.ys new file mode 100644 index 0000000..f9aa8df --- /dev/null +++ b/arch/sim/misc/sum.ys @@ -0,0 +1,36 @@ + .pos 0 + irmovq stack, %rsp + call main + halt + +# Sample linked list + .align 8 +ele1: + .quad 0x00a + .quad ele2 +ele2: + .quad 0x0b0 + .quad ele3 +ele3: + .quad 0xc00 + .quad 0 + +main: + irmovq ele1, %rdi + call sum_list + ret + +sum_list: + xorq %rax, %rax + jmp test +loop: + mrmovq (%rdi), %rsi + addq %rsi, %rax + mrmovq 8(%rdi), %rdi +test: + andq %rdi, %rdi + jne loop + ret + + .pos 0x200 +stack: diff --git a/arch/sim/misc/yas-grammar.lex b/arch/sim/misc/yas-grammar.lex new file mode 100644 index 0000000..be03756 --- /dev/null +++ b/arch/sim/misc/yas-grammar.lex @@ -0,0 +1,39 @@ +/* Grammar for Y86-64 Assembler */ + #include "yas.h" + +Instr rrmovq|cmovle|cmovl|cmove|cmovne|cmovge|cmovg|rmmovq|mrmovq|irmovq|addq|subq|andq|xorq|jmp|jle|jl|je|jne|jge|jg|call|ret|pushq|popq|"."byte|"."word|"."long|"."quad|"."pos|"."align|halt|nop|iaddq +Letter [a-zA-Z] +Digit [0-9] +Ident {Letter}({Letter}|{Digit}|_)* +Hex [0-9a-fA-F] +Blank [ \t] +Newline [\n\r] +Return [\r] +Char [^\n\r] +Reg %rax|%rcx|%rdx|%rbx|%rsi|%rdi|%rsp|%rbp|%r8|%r9|%r10|%r11|%r12|%r13|%r14 + +%x ERR COM +%% + +^{Char}*{Return}*{Newline} { save_line(yytext); REJECT;} /* Snarf input line */ +#{Char}*{Return}*{Newline} {finish_line(); lineno++;} +"//"{Char}*{Return}*{Newline} {finish_line(); lineno++;} +"/*"{Char}*{Return}*{Newline} {finish_line(); lineno++;} +{Blank}*{Return}*{Newline} {finish_line(); lineno++;} + +{Blank}+ ; +"$"+ ; +{Instr} add_instr(yytext); +{Reg} add_reg(yytext); +[-]?{Digit}+ add_num(atoll(yytext)); +"0"[xX]{Hex}+ add_num(atollh(yytext)); +[():,] add_punct(*yytext); +{Ident} add_ident(yytext); +{Char} {; BEGIN ERR;} +{Char}*{Newline} {fail("Invalid line"); lineno++; BEGIN 0;} +%% + +unsigned int atoh(const char *s) +{ + return(strtoul(s, NULL, 16)); +} diff --git a/arch/sim/misc/yas.c b/arch/sim/misc/yas.c new file mode 100644 index 0000000..f36b1b6 --- /dev/null +++ b/arch/sim/misc/yas.c @@ -0,0 +1,628 @@ +/* Assembler for Y86-64 instruction set */ + +#include +#include +#include + +#include "yas.h" +#include "isa.h" + +void add_symbol(char *, int); +int find_symbol(char *); +int instr_size(char *); + +int gui_mode = 0; + +FILE *outfile; + +int verbose = 0; +/* Generate initialized memory for Verilog? */ +int vcode = 0; + +/* Should it generate code for banked memory? */ +int block_factor = 0; + +int lineno = 1; /* Line number of input file */ +int bytepos = 0; /* Address of current instruction being processed */ +int error_mode = 0; /* Am I trying to finish off a line with an error? */ +int hit_error = 0; /* Have I hit any errors? */ + +int pass = 1; /* Am I in pass 1 or 2? */ + +/* General strategy is to read tokens for a complete line and then + process them. +*/ +#define TOK_PER_LINE 12 + +/* Token types */ +typedef enum{ TOK_IDENT, TOK_NUM, TOK_REG, TOK_INSTR, TOK_PUNCT, TOK_ERR } + token_t; + +/* Token representation */ +typedef struct { + char *sval; /* String */ + word_t ival; /* Integer */ + char cval; /* Character */ + token_t type; /* Type */ +} token_rec, *token_ptr; + +/* Information about current input line */ +token_rec tokens[TOK_PER_LINE]; +int lineno; /* What line number am I processing? */ +int bytepos; /* What byte address is the current instruction */ +int tcount; /* How many tokens are there in this line? */ +int tpos; /* What token am I currently processing */ + +/* Storage for strings in current line */ +#define STRMAX 4096 +char strbuf[STRMAX]; +int strpos; + +/* Storage of current line */ +char input_line[STRMAX]; + +void save_line(char *s) +{ + int len = strlen(s); + int i; + if (len >= STRMAX) + fail("Input Line too long"); + strcpy(input_line, s); + for (i = len-1; input_line[i] == '\n' || input_line[i] == '\r'; i--) + input_line[i] = '\0'; /* Remove terminator */ +} + +/* Information about current instruction being generated */ +char code[10]; /* Byte encoding */ +int codepos = 0; /* Current position in byte encoding */ +int bcount = 0; /* Length of current instruction */ + +/* Debugging information */ +char token_type_names[] = {'I', 'N', 'R', 'X', 'P'}; + +void print_token(FILE *out, token_ptr t) +{ + fprintf(out, " [%c ", token_type_names[t->type]); + switch(t->type) { + case TOK_IDENT: + case TOK_REG: + case TOK_INSTR: + fprintf(out, "%s]", t->sval); + break; + case TOK_NUM: + fprintf(out, "%lld]", t->ival); + break; + case TOK_PUNCT: + fprintf(out, "%c]", t->cval); + break; + case TOK_ERR: + fprintf(out, "ERR]"); + break; + default: + fprintf(out, "?]"); + fail("Unknown token type"); + } +} + +/* For debugging */ +void print_instruction(FILE *out) +{ + int i; + fprintf(out, "Line %d, Byte %d: ", lineno, bytepos); + for (i = 0; i < tcount; i++) + print_token(out, &tokens[i]); + fprintf(out, " Code: "); + for (i = 0; i < bcount; i++) + fprintf(out, "%.2x ", code[i] & 0xFF); + fprintf(out, "\n"); +} + +/* Write len least significant hex digits of value at dest. + Don't null terminate */ +static void hexstuff(char *dest, word_t value, int len) +{ + int i; + for (i = 0; i < len; i++) { + char c; + int h = (value >> 4*i) & 0xF; + c = h < 10 ? h + '0' : h - 10 + 'a'; + dest[len-i-1] = c; + } +} + +void print_code(FILE *out, int pos) +{ + char outstring[33]; + if (pos > 0xFFF) { + /* Printing format: + 0xHHHH: cccccccccccccccccccc | + where HHHH is address + cccccccccccccccccccc is code + */ + if (tcount) { + int i; + if (pos > 0xFFFF) { + fail("Code address limit exceeded"); + exit(1); + } + strcpy(outstring, "0x0000: | "); + hexstuff(outstring+2, pos, 4); + for (i = 0; i < bcount; i++) + hexstuff(outstring+7+2*i, code[i]&0xFF, 2); + } + else + strcpy(outstring, " | "); + } else { + /* Printing format: + 0xHHH: cccccccccccccccccccc | + where HHH is address + cccccccccccccccccccc is code + */ + if (tcount) { + int i; + if (pos > 0xFFF) { + fail("Code address limit exceeded"); + exit(1); + } + strcpy(outstring, "0x000: | "); + hexstuff(outstring+2, pos, 3); + for (i = 0; i < bcount; i++) + hexstuff(outstring+7+2*i, code[i]&0xFF, 2); + } + else + strcpy(outstring, " | "); + } + if (vcode) { + fprintf(out, "//%s%s\n", outstring, input_line); + if (tcount) { + int i; + for (i = 0; tcount && i < bcount; i++) { + if (block_factor) { + fprintf(out, " bank%d[%d] = 8\'h%.2x;\n", (pos+i)%block_factor, (pos+i)/block_factor, code[i] & 0xFF); + } else { + fprintf(out, " mem[%d] = 8\'h%.2x;\n", pos+i, code[i] & 0xFF); + } + } + } + } else { + fprintf(out, "%s%s\n", outstring, input_line); + } +} + +void fail(char *message) +{ + if (!error_mode) { + fprintf(stderr, "Error on line %d: %s\n", lineno, message); + fprintf(stderr, "Line %d, Byte 0x%.4x: %s\n", + lineno, bytepos, input_line); + } + error_mode = 1; + hit_error = 1; +} + +/* Parse Register from set of tokens and put into high or low + 4 bits of code[codepos] */ +void get_reg(int codepos, int hi) +{ + int rval = REG_NONE; + char c; + if (tokens[tpos].type != TOK_REG) { + fail("Expecting Register ID"); + return; + } else { + rval = find_register(tokens[tpos].sval); + } + /* Insert into output */ + c = code[codepos]; + if (hi) + c = (c & 0x0F) | (rval << 4); + else + c = (c & 0xF0) | rval; + code[codepos] = c; + tpos++; +} + +/* Get numeric value of given number of bytes */ +/* Offset indicates value to subtract from number (for PC relative) */ +void get_num(int codepos, int bytes, int offset) +{ + word_t val = 0; + int i; + if (tokens[tpos].type == TOK_NUM) { + val = tokens[tpos].ival; + } else if (tokens[tpos].type == TOK_IDENT) { + val = find_symbol(tokens[tpos].sval); + } else { + fail("Number Expected"); + return; + } + val -= offset; + for (i = 0; i < bytes; i++) + code[codepos+i] = (val >> (i * 8)) & 0xFF; + tpos++; +} + + +/* Get memory reference. + Can be of form: + Num(Reg) + (Reg) + Num + Ident + Ident(Reg) + Put Reg in low position of current byte, and Number in following bytes + */ +void get_mem(int codepos) +{ + char rval = REG_NONE; + word_t val = 0; + int i; + char c; + token_t type = tokens[tpos].type; + /* Deal with optional displacement */ + if (type == TOK_NUM) { + val = tokens[tpos++].ival; + type = tokens[tpos].type; + } else if (type == TOK_IDENT) { + val = find_symbol(tokens[tpos++].sval); + type = tokens[tpos].type; + } + /* Check for optional register */ + if (type == TOK_PUNCT) { + if (tokens[tpos].cval == '(') { + tpos++; + if (tokens[tpos].type == TOK_REG) + rval = find_register(tokens[tpos++].sval); + else { + fail("Expecting Register Id"); + return; + } + if (tokens[tpos].type != TOK_PUNCT || + tokens[tpos++].cval != ')') { + fail("Expecting ')'"); + return; + } + } + } + c = (code[codepos] & 0xF0) | (rval & 0xF); + code[codepos++] = c; + for (i = 0; i < 8; i++) + code[codepos+i] = (val >> (i*8)) & 0xFF; +} + +void start_line() +{ + int t; + error_mode = 0; + tpos = 0; + tcount = 0; + bcount = 0; + strpos = 0; + for (t = 0; t < TOK_PER_LINE; t++) + tokens[t].type = TOK_ERR; +} + +void finish_line() +{ + int size; + instr_ptr instr; + int savebytepos = bytepos; + tpos = 0; + codepos = 0; + if (tcount == 0) { + if (pass > 1) + print_code(outfile, savebytepos); + start_line(); + return; /* Empty line */ + } + /* Completion of an erroneous line */ + if (error_mode) { + start_line(); + return; + } + + /* See if this is a labeled line */ + if (tokens[0].type == TOK_IDENT) { + if (tokens[1].type != TOK_PUNCT || + tokens[1].cval != ':') { + fail("Missing Colon"); + start_line(); + return; + } else { + if (pass == 1) + add_symbol(tokens[0].sval, bytepos); + tpos+=2; + if (tcount == 2) { + /* That's all for this line */ + if (pass > 1) + print_code(outfile, savebytepos); + start_line(); + return; + } + } + } + /* Get instruction */ + if (tokens[tpos].type != TOK_INSTR) { + fail("Bad Instruction"); + start_line(); + return; + } + /* Process .pos */ + if (strcmp(tokens[tpos].sval, ".pos") == 0) { + if (tokens[++tpos].type != TOK_NUM) { + fail("Invalid Address"); + start_line(); + return; + } + bytepos = tokens[tpos].ival; + if (pass > 1) { + print_code(outfile, bytepos); + } + start_line(); + return; + } + /* Process .align */ + if (strcmp(tokens[tpos].sval, ".align") == 0) { + int a; + if (tokens[++tpos].type != TOK_NUM || (a=tokens[tpos].ival) <= 0) { + fail("Invalid Alignment"); + start_line(); + return; + } + bytepos = ((bytepos+a-1)/a)*a; + + if (pass > 1) { + print_code(outfile, bytepos); + } + start_line(); + return; + } + /* Get instruction size */ + instr = find_instr(tokens[tpos++].sval); + if (instr == NULL) { + fail("Invalid Instruction"); + instr = bad_instr(); + } + size = instr->bytes; + bytepos += size; + bcount = size; + + + /* If this is pass 1, then we're done */ + if (pass == 1) { + start_line(); + return; + } + + /* Here's where we really process the instructions */ + code[0] = instr->code; + code[1] = HPACK(REG_NONE, REG_NONE); + switch(instr->arg1) { + case R_ARG: + get_reg(instr->arg1pos, instr->arg1hi); + break; + case M_ARG: + get_mem(instr->arg1pos); + break; + case I_ARG: + get_num(instr->arg1pos, instr->arg1hi, 0); + break; + case NO_ARG: + default: + break; + } + if (instr->arg2 != NO_ARG) { + /* Get comma */ + if (tokens[tpos].type != TOK_PUNCT || + tokens[tpos].cval != ',') { + fail("Expecting Comma"); + start_line(); + return; + } + tpos++; + + /* Get second argument */ + switch(instr->arg2) { + case R_ARG: + get_reg(instr->arg2pos, instr->arg2hi); + break; + case M_ARG: + get_mem(instr->arg2pos); + break; + case I_ARG: + get_num(instr->arg2pos, instr->arg2hi, 0); + break; + case NO_ARG: + default: + break; + } + } + + print_code(outfile, savebytepos); + start_line(); +} + +void add_token(token_t type, char *s, word_t i, char c) +{ + char *t = NULL; + if (!tcount) + start_line(); + if (tpos >= TOK_PER_LINE-1) { + fail("Line too long"); + return; + } + if (s) { + int len = strlen(s)+1; + if (strpos + len > STRMAX) { + fail("Line too long"); + return; + } + t = strcpy(strbuf+strpos, s); + strpos+= len; + } + tokens[tcount].type = type; + tokens[tcount].sval = t; + tokens[tcount].ival = i; + tokens[tcount].cval = c; + tcount++; +} + +void add_ident(char *s) +{ + add_token(TOK_IDENT, s, 0, ' '); +} + +void add_instr(char *s) +{ + add_token(TOK_INSTR, s, 0, ' '); +} + +void add_reg(char *s) +{ + add_token(TOK_REG, s, 0, ' '); +} + +void add_num(long long i) +{ + add_token(TOK_NUM, NULL, i, ' '); +} + +void add_punct(char c) +{ + add_token(TOK_PUNCT, NULL, 0, c); +} + +#define STAB 1000 + +#define INIT_CNT 0 + +int symbol_cnt = INIT_CNT; +struct { + char *name; + int pos; +} symbol_table[STAB]; + +void add_symbol(char *name, int p) +{ + char *t = (char *) malloc(strlen(name)+1); + strcpy(t, name); + symbol_table[symbol_cnt].name = t; + symbol_table[symbol_cnt].pos = p; + symbol_cnt++; +} + +int find_symbol(char *name) +{ + int i; + for (i = 0; i < symbol_cnt; i++) + if (strcmp(name, symbol_table[i].name) == 0) + return symbol_table[i].pos; + fail("Can't find label"); + return -1; +} + +int yywrap() +{ + int i; + if (tcount > 0) { + fail("Missing end-of-line on final line\n"); + } + if (verbose && pass > 1) { + printf("Symbol Table:\n"); + for (i = INIT_CNT; i < symbol_cnt; i++) + printf(" %s\t0x%x\n", symbol_table[i].name, symbol_table[i].pos); + } + return 1; +} + +extern FILE *yyin; +int yylex(); + +static void usage(char *pname) +{ + printf("Usage: %s [-V[n]] file.ys\n", pname); + printf(" -V[n] Generate memory initialization in Verilog format (n-way blocking)\n"); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int rootlen; + char infname[512]; + char outfname[512]; + int nextarg = 1; + if (argc < 2) + usage(argv[0]); + if (argv[nextarg][0] == '-') { + char flag = argv[nextarg][1]; + switch (flag) { + case 'V': + vcode = 1; + if (argv[nextarg][2]) { + block_factor = atoi(argv[nextarg]+2); + if (block_factor != 8) { + fprintf(stderr, "Unknown blocking factor %d\n", block_factor); + exit(1); + } + } + nextarg++; + break; + default: + usage(argv[0]); + } + } + rootlen = strlen(argv[nextarg])-3; + if (strcmp(argv[nextarg]+rootlen, ".ys")) + usage(argv[0]); + if (rootlen > 500) { + fprintf(stderr, "File name too long\n"); + exit(1); + } + strncpy(infname, argv[nextarg], rootlen); + strcpy(infname+rootlen, ".ys"); + + yyin = fopen(infname, "r"); + if (!yyin) { + fprintf(stderr, "Can't open input file '%s'\n", infname); + exit(1); + } + + if (vcode) { + outfile = stdout; + } else { + strncpy(outfname, argv[nextarg], rootlen); + strcpy(outfname+rootlen, ".yo"); + outfile = fopen(outfname, "w"); + if (!outfile) { + fprintf(stderr, "Can't open output file '%s'\n", outfname); + exit(1); + } + } + + pass = 1; + + yylex(); + fclose(yyin); + + if (hit_error) + exit(1); + + pass = 2; + lineno = 1; + error_mode = 0; + bytepos = 0; + yyin = fopen(infname, "r"); + if (!yyin) { + fprintf(stderr, "Can't open input file '%s'\n", infname); + exit(1); + } + + yylex(); + fclose(yyin); + fclose(outfile); + return hit_error; +} + +unsigned long long atollh(const char *p) { + return strtoull(p, (char **) NULL, 16); +} diff --git a/arch/sim/misc/yas.h b/arch/sim/misc/yas.h new file mode 100644 index 0000000..edbf6ff --- /dev/null +++ b/arch/sim/misc/yas.h @@ -0,0 +1,13 @@ +void save_line(char *); +void finish_line(); +void add_reg(char *); +void add_ident(char *); +void add_instr(char *); +void add_punct(char); +void add_num(long long); +void fail(char *msg); +unsigned long long atollh(const char *); + + +/* Current line number */ +int lineno; diff --git a/arch/sim/misc/yis.c b/arch/sim/misc/yis.c new file mode 100644 index 0000000..88e49d1 --- /dev/null +++ b/arch/sim/misc/yis.c @@ -0,0 +1,64 @@ +/* Instruction set simulator for Y86-64 Architecture */ + +#include +#include + +#include "isa.h" + +/* YIS never runs in GUI mode */ +int gui_mode = 0; + +void usage(char *pname) +{ + printf("Usage: %s code_file [max_steps]\n", pname); + exit(0); +} + +int main(int argc, char *argv[]) +{ + FILE *code_file; + int max_steps = 10000; + + state_ptr s = new_state(MEM_SIZE); + mem_t saver = copy_reg(s->r); + mem_t savem; + int step = 0; + + stat_t e = STAT_AOK; + + if (argc < 2 || argc > 3) + usage(argv[0]); + code_file = fopen(argv[1], "r"); + if (!code_file) { + fprintf(stderr, "Can't open code file '%s'\n", argv[1]); + exit(1); + } + + if (!load_mem(s->m, code_file, 1)) { + printf("Exiting\n"); + return 1; + } + + savem = copy_mem(s->m); + + if (argc > 2) + max_steps = atoi(argv[2]); + + for (step = 0; step < max_steps && e == STAT_AOK; step++) + e = step_state(s, stdout); + + printf("Stopped in %d steps at PC = 0x%llx. Status '%s', CC %s\n", + step, s->pc, stat_name(e), cc_name(s->cc)); + + printf("Changes to registers:\n"); + diff_reg(saver, s->r, stdout); + + printf("\nChanges to memory:\n"); + diff_mem(savem, s->m, stdout); + + free_state(s); + free_reg(saver); + free_mem(savem); + + return 0; +} diff --git a/arch/sim/pipe/Makefile b/arch/sim/pipe/Makefile new file mode 100644 index 0000000..0d46c3b --- /dev/null +++ b/arch/sim/pipe/Makefile @@ -0,0 +1,63 @@ +# Modify this line to indicate the default version to build + +VERSION=std + +# Comment this out if you don't have Tcl/Tk on your system + +GUIMODE=-DHAS_GUI + +# Modify the following line so that gcc can find the libtcl.so and +# libtk.so libraries on your system. You may need to use the -L option +# to tell gcc which directory to look in. Comment this out if you +# don't have Tcl/Tk. + +TKLIBS=-L/usr/lib -ltk -ltcl + +# Modify the following line so that gcc can find the tcl.h and tk.h +# header files on your system. Comment this out if you don't have +# Tcl/Tk. + +TKINC=-isystem /usr/include/tcl8.5 + +# Modify these two lines to choose your compiler and compile time +# flags. + +CC=gcc +CFLAGS=-Wall -O2 -fcommon + +################################################## +# You shouldn't need to modify anything below here +################################################## + +MISCDIR=../misc +HCL2C=$(MISCDIR)/hcl2c +INC=$(TKINC) -I$(MISCDIR) $(GUIMODE) +LIBS=$(TKLIBS) -lm +YAS = ../misc/yas + +all: psim drivers + +# This rule builds the PIPE simulator +psim: psim.c sim.h pipe-$(VERSION).hcl $(MISCDIR)/isa.c $(MISCDIR)/isa.h + # Building the pipe-$(VERSION).hcl version of PIPE + $(HCL2C) -n pipe-$(VERSION).hcl < pipe-$(VERSION).hcl > pipe-$(VERSION).c + $(CC) $(CFLAGS) $(INC) -o psim psim.c pipe-$(VERSION).c \ + $(MISCDIR)/isa.c $(LIBS) + +# This rule builds driver programs for Part C of the Architecture Lab +drivers: + ./gen-driver.pl -n 4 -f ncopy.ys > sdriver.ys + ../misc/yas sdriver.ys + ./gen-driver.pl -n 63 -f ncopy.ys > ldriver.ys + ../misc/yas ldriver.ys + +# These are implicit rules for assembling .yo files from .ys files. +.SUFFIXES: .ys .yo +.ys.yo: + $(YAS) $*.ys + + +clean: + rm -f psim pipe-*.c *.o *.exe *~ + + diff --git a/arch/sim/pipe/README b/arch/sim/pipe/README new file mode 100644 index 0000000..f7ffb5a --- /dev/null +++ b/arch/sim/pipe/README @@ -0,0 +1,150 @@ +/*********************************************************************** + * Pipelined Y86-64 Simulator + * + * Copyright (c) 2002, 2010, 2015 R. Bryant and D. O'Hallaron, + * All rights reserved. + * May not be used, modified, or copied without permission. + ***********************************************************************/ + +This directory contains the code to construct simulators for PIPE and +the variants of it described in the homework exercises. + +************************* +1. Building the simulator +************************* + +Different versions of the PIPE simulator can be constructed to use +different HCL files when working on the different homework problems. + + +Binary VERSION HCL File Description +psim std pipe-std.hcl Standard simulator (default) +psim broken pipe-broken.hcl Does not handle any hazards +psim full pipe-full.hcl For adding iaddq +psim nobypass pipe-nobypass.hcl For implementing PIPE- + (called pipe-stall.hcl in text) +psim lf pipe-lf.hcl For implementing load forwarding +psim nt pipe-nt.hcl For implementing NT branch prediction +psim btfnt pipe-btfnt.hcl For implementing BTFNT branch pred. +psim 1w pipe-1w.hcl For implementing single write port +psim super pipe-super.hcl Implements iaddq & load forwarding + +The Makefile can be configured to build simulators that support GUI +and/or TTY interfaces. A simulator running in TTY mode prints all +information about its runtime behavior on the terminal. It's hard to +understand what's going on, but useful for automated testing, and +doesn't require any special installation features. A simulator +running in GUI mode uses a fancy graphical user interface. Nice for +visualizing and debugging, but requires installation of Tcl/Tk on your +system. + +The Makefile has simple instructions for building the TTY and GUI +forms. In either case, once you've configured the Makefile, you can +build different versions of the simulators with different HCL files +with commands of the form: + + unix> make clean; make psim VERSION=xxx + +where "xxx" is one of the versions listed above. To save typing, you +can set the Makefile's VERSION variable. For example, if you are working +on Problems 4.52 and 4.53, which require to modify pipe-full.hcl, then +you could set VERSION=full in the Makefile. Typing + + unix> make clean; make psim + +would then make the pipe-full.hcl version of PIPE. + +*********************** +2. Using the simulators +*********************** + +The simulator recognizes the following command line arguments: + +Usage: psim [-htg] [-l m] [-v n] file.yo + +file.yo required in GUI mode, optional in TTY mode (default stdin) + + -h Print this message + -g Run in GUI mode instead of TTY mode (default TTY mode) + -l m Set instruction limit to m [TTY mode only] (default 10000) + -v n Set verbosity level to 0 <= n <= 2 [TTY mode only] (default 2) + -t Test result against the ISA simulator (yis) [TTY model only] + +******** +3. Files +******** + +Makefile Build the simulator +Makefile-sim Makefile for the student distribution +README This file + +********************************************** +* Files related to the CS:APP Architecture Lab +********************************************** + +* Sample programs +ncopy.ys The default version of ncopy that the students optimize +ncopy.c C version of ncopy that defines its semantics + +* Preconstructed driver programs (by gen-driver.pl) +sdriver.ys Driver that calls ncopy.ys on a short (4-word) array +ldriver.ys Driver that calls ncopy.ys on a longer (63-word) array + Both drivers are generated automatically by the + Makefile by typing "make drivers". + +* Solution files (Instructors only) +gen-ncopy.pl Generates versions of benchmark program with various + optimizations. See comments in file for explanation. + +* Testing scripts +gen-driver.pl Generate a driver program for an arbitrary ncopy + implementation (default ncopy.ys). Type "make drivers" + to construct sdriver.ys and ldriver.ys. +benchmark.pl Runs an implementation of ncopy on array sizes + 1 to 64 (default ncopy.ys) and computes its performance + in units of CPE (cycles per element). +correctness.pl Runs an implementation of ncopy on array sizes + 0 to 64, and several longer ones and checks each for + correctness. +check-len.pl Determines number of bytes in .yo representation of + ncopy function. + + +**************************************************** +* HCL files for different versions of the simulators +**************************************************** + +pipe-std.hcl The standard PIPE processor described in the text +pipe-broken.hcl A simulator that does not detect or handle hazards + (useful when explaining hazards in lectures) + +* HCL files for various CS:APP Homework Problems +pipe-nobypass.hcl 4.51: Build version of PIPE without bypassing + (called pipe-stall.hcl in the text) +pipe-full.hcl 4.52-53: Add iaddq instruction to PIPE +pipe-nt.hcl 4.54: Implement branch not taken strategy +pipe-btfnt.hcl 4.55: Implement back-taken forward-not-taken strategy +pipe-lf.hcl 4.56: Implement load forwarding logic +pipe-1w.hcl 4.57: Implement single ported register file + +* HCL solution files for the CS:APP Homework Problems (Instructors only) +pipe-nobypass-ans.hcl 4.51 solution +pipe-full-ans.hcl 4.52-53 solutions +pipe-nt-ans.hcl 4.54 solution +pipe-btfnt-ans.hcl 4.55 solution +pipe-lf-ans.hcl 4.56 solutions +pipe-1w-ans.hcl 4.57 solutions +pipe-super.hcl Gives best performance for lab + +***************************** +* PIPE simulator source files +***************************** + +psim.c Base simulator code +sim.h PIPE header files +pipeline.h +stages.h +pipe.tcl TCL script for the GUI version of PIPE + + + diff --git a/arch/sim/pipe/benchmark.pl b/arch/sim/pipe/benchmark.pl new file mode 100755 index 0000000..51a41e6 --- /dev/null +++ b/arch/sim/pipe/benchmark.pl @@ -0,0 +1,110 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl + +# +# benchmark.pl - Run test of pipeline on ncopy for different block sizes +# and determine CPE (cycles per element) +# +use Getopt::Std; + +# +# Configuration +# +$blocklen = 64; +$yas = "../misc/yas"; +$pipe = "./psim"; +$gendriver = "./gen-driver.pl"; +$fname = "bdriver"; +$verbose = 1; + +## Grading criteria +$totalpoints = 60; +# What CPE is required to get full credit? +$fullcpe = 7.5; +# What CPE is required to get nonzero credit: +$threshcpe = 10.5; + + + +# +# usage - Print the help message and terminate +# +sub usage { + print STDERR "Usage: $0 [-hq] [-n N] -f FILE\n"; + print STDERR " -h Print help message\n"; + print STDERR " -q Quiet mode (default verbose)\n"; + print STDERR " -n N Set max number of elements up to 64 (default $blocklen)\n"; + print STDERR " -f FILE Input .ys file is FILE\n"; + die "\n"; +} + +getopts('hqn:f:'); + +if ($opt_h) { + usage(); +} + +if ($opt_q) { + $verbose = 0; +} + +if ($opt_n) { + $blocklen = $opt_n; + if ($blocklen < 0 || $blocklen > 64) { + print STDERR "n must be between 0 and 64\n"; + die "\n"; + } +} + +# Filename is required +if (!$opt_f) { + $ncopy = "ncopy"; +} else { + $ncopy = $opt_f; + # Strip off .ys + $ncopy =~ s/\.ys//; +} + +if ($verbose) { + print "\t$ncopy\n"; +} + +$tcpe = 0; +for ($i = 0; $i <= $blocklen; $i++) { + !(system "$gendriver -n $i -f $ncopy.ys > $fname$i.ys") || + die "Couldn't generate driver file $fname$i.ys\n"; + !(system "$yas $fname$i.ys") || + die "Couldn't assemble file $fname$i.ys\n"; + $stat = `$pipe -v 0 $fname$i.yo` || + die "Couldn't simulate file $fname$i.yo\n"; + !(system "rm $fname$i.ys $fname$i.yo") || + die "Couldn't remove files $fname$i.ys and/or $fname$i.yo\n"; + chomp $stat; + $stat =~ s/[ ]*CPI:[ ]*//; + $stat =~ s/ cycles.*//; + if ($i > 0) { + $cpe = $stat/$i; + if ($verbose) { + printf "%d\t%d\t%.2f\n", $i, $stat, $cpe; + } + $tcpe += $cpe; + } else { + if ($verbose) { + printf "%d\t%d\n", $i, $stat; + } + } + +} + +$acpe = $tcpe/$blocklen; +printf "Average CPE\t%.2f\n", $acpe; + +## Compute Score +$score = 0; +if ($acpe <= $fullcpe) { + $score = $totalpoints; +} elsif ($acpe <= $threshcpe) { + $score = $totalpoints * ($threshcpe - $acpe)/($threshcpe - $fullcpe); +} +printf "Score\t%.1f/%.1f\n", $score, $totalpoints; + diff --git a/arch/sim/pipe/check-len.pl b/arch/sim/pipe/check-len.pl new file mode 100755 index 0000000..63adff5 --- /dev/null +++ b/arch/sim/pipe/check-len.pl @@ -0,0 +1,25 @@ +#!/usr/bin/perl + +# Check length of ncopy function in .yo file +# Assumes that function starts with label "ncopy:" +# and finishes with label "End:" + +$startpos = -1; +$endpos = -1; + +while (<>) { + $line = $_; + if ($line =~ /(0x[0-9a-fA-F]+):.* ncopy:/) { + $startpos = hex($1); + } + if ($line =~ /(0x[0-9a-fA-F]+):.* End:/) { + $endpos = hex($1); + } +} + +if ($startpos >= 0 && $endpos > $startpos) { + $len = $endpos - $startpos; + print "ncopy length = $len bytes\n"; +} else { + print "Couldn't determine ncopy length\n"; +} diff --git a/arch/sim/pipe/correctness.pl b/arch/sim/pipe/correctness.pl new file mode 100755 index 0000000..bba36ca --- /dev/null +++ b/arch/sim/pipe/correctness.pl @@ -0,0 +1,139 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl + +# +# correctness.pl - Test ncopy assembly code for correctness +# +use Getopt::Std; + +# +# Configuration +# +$blocklen = 64; +$over = 3; +$yas = "../misc/yas"; +$yis = "../misc/yis"; +$pipe = "./psim"; +$gendriver = "./gen-driver.pl"; +$fname = "cdriver"; +$verbose = 1; +# Maximum allowable code length +$bytelim = 1000; + +# +# usage - Print the help message and terminate +# +sub usage { + print STDERR "Usage: $0 [-hqp] [-n N] -f FILE\n"; + print STDERR " -h Print help message\n"; + print STDERR " -q Quiet mode (default verbose)\n"; + print STDERR " -p Run program on pipeline simulator (default ISA sim)\n"; + print STDERR " -n N Set max number of elements up to 64 (default $blocklen)\n"; + print STDERR " -f FILE Input .ys file is FILE\n"; + print STDERR " -b blim set byte limit for function\n"; + die "\n"; +} + +getopts('hqpn:f:b:'); + +if ($opt_h) { + usage(); +} + +if ($opt_q) { + $verbose = 0; +} + +if ($opt_b) { + $bytelim = $opt_b; +} + +$usepipe = 0; +if ($opt_p) { + $usepipe = 1; + print "Simulating with pipeline simulator psim\n"; +} else { + print "Simulating with instruction set simulator yis\n"; +} + + +if ($opt_n) { + $blocklen = $opt_n; + if ($blocklen < 0) { + print STDERR "n must be >= 0\n"; + die "\n"; + } +} + +# Filename is required +if (!$opt_f) { + $ncopy = "ncopy"; +} else { + $ncopy = $opt_f; + # Strip off .ys + $ncopy =~ s/\.ys//; +} + +if ($verbose) { + print "\t$ncopy\n"; +} + +$goodcnt = 0; + +for ($i = 0; $i <= $blocklen+$over; $i++) { + $len = $i; + if ($i > $blocklen) { + # Try some larger values + $len = $blocklen * ($i - $blocklen + 1); + } + !(system "$gendriver -rc -n $len -f $ncopy.ys -b $bytelim > $fname$len.ys") || + die "Couldn't generate driver file $fname$len.ys\n"; + !(system "$yas $fname$len.ys") || + die "Couldn't assemble file $fname$len.ys\n"; + if ($usepipe) { + !(system "$pipe -v 1 $fname$len.yo > $fname$len.pipe") || + die "Couldn't simulate file $fname$len.yo with pipeline simulator\n"; + $stat = `grep "rax:" $fname$len.pipe`; + !(system "rm $fname$len.ys $fname$len.yo $fname$len.pipe") || + die "Couldn't remove files $fname$len.ys and/or $fname$len.yo and/or $fname$len.pipe\n"; + chomp $stat; + } else { + !(system "$yis $fname$len.yo > $fname$len.yis") || + die "Couldn't simulate file $fname$len.yo with instruction set simulator\n"; + $stat = `grep rax $fname$len.yis`; + !(system "rm $fname$len.ys $fname$len.yo $fname$len.yis") || + die "Couldn't remove files $fname$len.ys and/or $fname$len.yo and/or $fname$len.yis\n"; + chomp $stat; + } + $result = "failed"; + if ($stat =~ "zzzz") { + $result = "Couldn't run checking code"; + } + if ($stat =~ "aaaa") { + $result = "OK"; + $goodcnt ++; + } + if ($stat =~ "bbbb") { + $result = "Bad count"; + } + if ($stat =~ "cccc") { + $result = "Program too long"; + printf "%d\t%s\n", $len, $result; + last; + } + if ($stat =~ "dddd") { + $result = "Incorrect copying"; + } + if ($stat =~ "eeee") { + $result = "Corruption before or after destination"; + } + if ($verbose) { + printf "%d\t%s\n", $len, $result; + } +} + +$bp1 = $blocklen+$over+1; +printf "$goodcnt/$bp1 pass correctness test\n"; + + + diff --git a/arch/sim/pipe/gen-driver.pl b/arch/sim/pipe/gen-driver.pl new file mode 100755 index 0000000..d2fff16 --- /dev/null +++ b/arch/sim/pipe/gen-driver.pl @@ -0,0 +1,247 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl + +# +# gen-driver - Generate driver file for any ncopy function +# +use Getopt::Std; + +$n = 0; + +getopts('hcrn:f:b:'); + +if ($opt_h) { + print STDERR "Usage $argv[0] [-h] [-c] [-n N] [-f FILE]\n"; + print STDERR " -h print help message\n"; + print STDERR " -c include correctness checking code\n"; + print STDERR " -n N set number of elements\n"; + print STDERR " -f FILE set input file (default stdin)\n"; + print STDERR " -b blim set byte limit for function\n"; + print STDERR " -r Allow random result\n"; + die "\n"; +} + +$check = 0; +if ($opt_c) { + $check = 1; +} + +$bytelim = 1000; +if ($opt_b) { + $bytelim = $opt_b; +} + +if ($opt_n) { + $n = $opt_n; + if ($n < 0) { + print STDERR "n must be at least 0\n"; + die "\n"; + } +} + +$randomval = 0; +# Accumulated count +$rval = 0; + +if ($opt_r) { + $randomval = 1; +} else { + # Value that should be returned by function + $tval = int($n/2); +} + + +# The data to be stored. +@data = (); + +for ($i = 0; $i < $n; $i++) { + $data[$i] = -($i+1); + if ($randomval) { + if (int(rand(2)) == 1) { + $data[$i] = -$data[$i]; + $rval++; + } + } else { + if ($rval < $tval && int(rand(2)) % 2 == 1 || + $tval - $rval >= $n - $i) { + $data[$i] = -$data[$i]; + $rval++; + } + } +} + + +# Values to put at beginning and end of destination +$Preval = "0xbcdefa"; +$Postval = "0xdefabc"; + + +print <) { + printf "%s", $_; + } +} else { + while (<>) { + printf "%s", $_; + } +} +print "EndFun:\n"; + +if ($check) { +print <0) contained in src. +# +# Include your name and ID here. +# +# Describe how and why you modified the baseline code. +# +################################################################## +# Do not modify this portion +# Function prologue. +# %rdi = src, %rsi = dst, %rdx = len +ncopy: + +################################################################## +# You can modify this portion + # Loop header + xorq %rax,%rax # count = 0; + iaddq $0xfffffffffffffffc, %rdx + jle Tail # if so, goto Done: + +Loop1: + mrmovq (%rdi), %r10 # read val from src... + rmmovq %r10, (%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos1 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos1: + + mrmovq 8(%rdi), %r10 # read val from src... + rmmovq %r10, 8(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos2 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos2: + + mrmovq 16(%rdi), %r10 # read val from src... + rmmovq %r10, 16(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos3 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos3: + + mrmovq 24(%rdi), %r10 # read val from src... + rmmovq %r10, 24(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos4 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos4: + + mrmovq 32(%rdi), %r10 # read val from src... + rmmovq %r10, 32(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos5 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos5: + + iaddq $40, %rdi # src++ + iaddq $40, %rsi # dst++ + iaddq $0xfffffffffffffffb, %rdx # len-- + jg Loop1 + +Tail: + iaddq $4, %rdx + jle Done +Loop2: + mrmovq (%rdi), %r10 + rmmovq %r10, (%rsi) + andq %r10, %r10 + jle NposT + iaddq $1, %rax +NposT: + iaddq $8, %rdi + iaddq $8, %rsi + iaddq $0xffffffffffffffff, %rdx + jg Loop2 + + +################################################################## +# Do not modify the following section of code +# Function epilogue. +Done: + ret +################################################################## +# Keep the following label at the end of your function +End: +#/* $end ncopy-ys */ +EndFun: + +############################### +# Source and destination blocks +############################### + .align 8 +src: + .quad 1 + .quad 2 + .quad -3 + .quad -4 + .quad -5 + .quad 6 + .quad -7 + .quad 8 + .quad 9 + .quad -10 + .quad 11 + .quad 12 + .quad -13 + .quad 14 + .quad -15 + .quad 16 + .quad -17 + .quad -18 + .quad 19 + .quad -20 + .quad 21 + .quad -22 + .quad -23 + .quad -24 + .quad -25 + .quad -26 + .quad 27 + .quad -28 + .quad -29 + .quad -30 + .quad 31 + .quad -32 + .quad 33 + .quad -34 + .quad 35 + .quad 36 + .quad -37 + .quad 38 + .quad 39 + .quad 40 + .quad 41 + .quad -42 + .quad 43 + .quad 44 + .quad 45 + .quad 46 + .quad 47 + .quad 48 + .quad 49 + .quad 50 + .quad 51 + .quad -52 + .quad -53 + .quad 54 + .quad -55 + .quad -56 + .quad 57 + .quad -58 + .quad -59 + .quad -60 + .quad -61 + .quad -62 + .quad -63 + .quad 0xbcdefa # This shouldn't get moved + + .align 16 +Predest: + .quad 0xbcdefa +dest: + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab +Postdest: + .quad 0xdefabc + +.align 8 +# Run time stack + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + +Stack: diff --git a/arch/sim/pipe/ncopy.c b/arch/sim/pipe/ncopy.c new file mode 100644 index 0000000..a576f8e --- /dev/null +++ b/arch/sim/pipe/ncopy.c @@ -0,0 +1,39 @@ +#include + +typedef word_t word_t; + +word_t src[8], dst[8]; + +/* $begin ncopy */ +/* + * ncopy - copy src to dst, returning number of positive ints + * contained in src array. + */ +word_t ncopy(word_t *src, word_t *dst, word_t len) +{ + word_t count = 0; + word_t val; + + while (len > 0) { + val = *src++; + *dst++ = val; + if (val > 0) + count++; + len--; + } + return count; +} +/* $end ncopy */ + +int main() +{ + word_t i, count; + + for (i=0; i<8; i++) + src[i]= i+1; + count = ncopy(src, dst, 8); + printf ("count=%d\n", count); + exit(0); +} + + diff --git a/arch/sim/pipe/ncopy.ys b/arch/sim/pipe/ncopy.ys new file mode 100644 index 0000000..08aa9f1 --- /dev/null +++ b/arch/sim/pipe/ncopy.ys @@ -0,0 +1,183 @@ +#/* $begin ncopy-ys */ +################################################################## +# ncopy.ys - Copy a src block of len words to dst. +# Return the number of positive words (>0) contained in src. +# +# Include your name and ID here. +# +# Describe how and why you modified the baseline code. +# +################################################################## +# Do not modify this portion +# Function prologue. +# %rdi = src, %rsi = dst, %rdx = len +ncopy: + +################################################################## +# You can modify this portion + + xorq %rax, %rax + iaddq $0xfffffffffffffff7, %rdx + jle Tail + +Loop: + mrmovq (%rdi), %r10 + rmmovq %r10, (%rsi) + andq %r10, %r10 + jle Npos1 + iaddq $1, %rax +Npos1: + + mrmovq 8(%rdi), %r10 + rmmovq %r10, 8(%rsi) + andq %r10, %r10 + jle Npos2 + iaddq $1, %rax +Npos2: + + mrmovq 16(%rdi), %r10 + rmmovq %r10, 16(%rsi) + andq %r10, %r10 + jle Npos3 + iaddq $1, %rax +Npos3: + + mrmovq 24(%rdi), %r10 + rmmovq %r10, 24(%rsi) + andq %r10, %r10 + jle Npos4 + iaddq $1, %rax +Npos4: + + mrmovq 32(%rdi), %r10 + rmmovq %r10, 32(%rsi) + andq %r10, %r10 + jle Npos5 + iaddq $1, %rax +Npos5: + + mrmovq 40(%rdi), %r10 + rmmovq %r10, 40(%rsi) + andq %r10, %r10 + jle Npos6 + iaddq $1, %rax +Npos6: + + mrmovq 48(%rdi), %r10 + rmmovq %r10, 48(%rsi) + andq %r10, %r10 + jle Npos7 + iaddq $1, %rax +Npos7: + + mrmovq 56(%rdi), %r10 + rmmovq %r10, 56(%rsi) + andq %r10, %r10 + jle Npos8 + iaddq $1, %rax +Npos8: + + mrmovq 64(%rdi), %r10 + rmmovq %r10, 64(%rsi) + andq %r10, %r10 + jle Npos9 + iaddq $1, %rax +Npos9: + + mrmovq 72(%rdi), %r10 + rmmovq %r10, 72(%rsi) + andq %r10, %r10 + jle Npos10 + iaddq $1, %rax +Npos10: + + iaddq $80, %rdi + iaddq $80, %rsi + iaddq $0xfffffffffffffff6, %rdx + jg Loop + +Tail: + addq %rdx, %rdx + addq %rdx, %rdx + addq %rdx, %rdx + mrmovq JT(%rdx), %rdx + pushq %rdx + ret + + .quad Done + .quad J1 + .quad J2 + .quad J3 + .quad J4 + .quad J5 + .quad J6 + .quad J7 + .quad J8 +JT: + .quad J9 + +J9: + mrmovq 64(%rdi), %r10 + rmmovq %r10, 64(%rsi) + andq %r10, %r10 + jle J8 + iaddq $1, %rax +J8: + mrmovq 56(%rdi), %r10 + rmmovq %r10, 56(%rsi) + andq %r10, %r10 + jle J7 + iaddq $1, %rax +J7: + mrmovq 48(%rdi), %r10 + rmmovq %r10, 48(%rsi) + andq %r10, %r10 + jle J6 + iaddq $1, %rax +J6: + mrmovq 40(%rdi), %r10 + rmmovq %r10, 40(%rsi) + andq %r10, %r10 + jle J5 + iaddq $1, %rax +J5: + mrmovq 32(%rdi), %r10 + rmmovq %r10, 32(%rsi) + andq %r10, %r10 + jle J4 + iaddq $1, %rax +J4: + mrmovq 24(%rdi), %r10 + rmmovq %r10, 24(%rsi) + andq %r10, %r10 + jle J3 + iaddq $1, %rax +J3: + mrmovq 16(%rdi), %r10 + rmmovq %r10, 16(%rsi) + andq %r10, %r10 + jle J2 + iaddq $1, %rax +J2: + mrmovq 8(%rdi), %r10 + rmmovq %r10, 8(%rsi) + andq %r10, %r10 + jle J1 + iaddq $1, %rax +J1: + mrmovq (%rdi), %r10 + rmmovq %r10, (%rsi) + andq %r10, %r10 + jle Done + iaddq $1, %rax + +################################################################## +# Do not modify the following section of code +# Function epilogue. +Done: + ret + +################################################################## +# Keep the following label at the end of your function +End: +#/* $end ncopy-ys */ diff --git a/arch/sim/pipe/pipe-1w.hcl b/arch/sim/pipe/pipe-1w.hcl new file mode 100644 index 0000000..f6d5daa --- /dev/null +++ b/arch/sim/pipe/pipe-1w.hcl @@ -0,0 +1,395 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +## Your task is to modify the design so that on any cycle, only +## one of the two possible (valE and valM) register writes will occur. +## This requires special handling of the popq instruction. +## Overall strategy: IPOPQ passes through pipe, +## treated as stack pointer increment, but not incrementing the PC +## On refetch, modify fetched icode to indicate an instruction "IPOP2", +## which reads from memory. +## This requires modifying the definition of f_icode +## and lots of other changes. Relevant positions to change +## are indicated by comments starting with keyword "1W". + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' +# 1W: Special instruction code for second try of popq +wordsig IPOP2 'I_POP2' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +## 1W: Provide access to the PC value for the current instruction +wordsig f_pc 'f_pc' # Address of fetched instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && !M_Cnd : M_valA; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +## 1W: To split ipopq into two cycles, need to be able to +## modify value of icode, +## so that it will be IPOP2 when fetched for second time. +word f_icode = [ + imem_error : INOP; + D_icode == IPOPQ : IPOP2; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ, IPOP2 }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOP2, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + f_icode in { IJXX, ICALL } : f_valC; + ## 1W: Want to refetch popq one time + f_icode == IPOPQ : F_predPC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + +## W1: Strategy. Decoding of popq rA should be treated the same +## as would iaddq $8, %rsp +## Decoding of pop2 rA treated same as mrmovq -8(%rsp), rA + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ, IPOP2 } : D_rA; + D_icode == IRET : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, IPOP2, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOP2 } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## Forward into decode stage for valA +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + d_srcA == e_dstE : e_valE; # Forward valE from execute + d_srcA == M_dstM : m_valM; # Forward valM from memory + d_srcA == M_dstE : M_valE; # Forward valE from memory + d_srcA == W_dstM : W_valM; # Forward valM from write back + d_srcA == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalA; # Use value read from register file +]; + +word d_valB = [ + d_srcB == e_dstE : e_valE; # Forward valE from execute + d_srcB == M_dstM : m_valM; # Forward valM from memory + d_srcB == M_dstE : M_valE; # Forward valE from memory + d_srcB == W_dstM : W_valM; # Forward valM from write back + d_srcB == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalB; # Use value read from register file +]; + +################ Execute Stage ##################################### + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : E_valC; + E_icode in { ICALL, IPUSHQ, IPOP2 } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ, IPOP2 } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = E_valA; # Pass valA through stage + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ, IPOP2 } : M_valE; + M_icode == IRET : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IRET, IPOP2 }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +################ Write back stage ################################## + +## 1W: For this problem, we introduce a multiplexor that merges +## valE and valM into a single value for writing to register port E. +## DO NOT CHANGE THIS LOGIC +## Merge both write back sources onto register port E +## Set E port register ID +word w_dstE = [ + ## writing from valM + W_dstM != RNONE : W_dstM; + 1: W_dstE; +]; + +## Set E port value +word w_valE = [ + W_dstM != RNONE : W_valM; + 1: W_valE; +]; + +## Disable register port M +## Set M port register ID +word w_dstM = RNONE; + +## Set M port value +word w_valM = 0; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOP2 } && + E_dstM in { d_srcA, d_srcB } || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOP2 } && + E_dstM in { d_srcA, d_srcB }; + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Stalling at fetch while ret passes through pipeline + # but not condition for a load/use hazard + !(E_icode in { IMRMOVQ, IPOP2 } && E_dstM in { d_srcA, d_srcB }) && + # 1W: This condition will change + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOP2 } && + E_dstM in { d_srcA, d_srcB}; + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-broken.hcl b/arch/sim/pipe/pipe-broken.hcl new file mode 100644 index 0000000..eac6a61 --- /dev/null +++ b/arch/sim/pipe/pipe-broken.hcl @@ -0,0 +1,331 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### +## This version does not detect or handle any hazards + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && !M_Cnd : M_valA; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + f_icode in { IJXX, ICALL } : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## No forwarding. valA is either valP or value from register file +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + 1 : d_rvalA; # Use value read from register file +]; + +## No forwarding. valB is value from register file +word d_valB = d_rvalB; + +################ Execute Stage ##################################### + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = E_valA; # Pass valA through stage + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + 0; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + 0; + +bool D_bubble = + 0; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + 0; + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-btfnt.hcl b/arch/sim/pipe/pipe-btfnt.hcl new file mode 100644 index 0000000..51f47c9 --- /dev/null +++ b/arch/sim/pipe/pipe-btfnt.hcl @@ -0,0 +1,380 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +## Your task is to modify the design so that conditional branches are +## predicted as being taken when backward and not-taken when forward +## The code here is nearly identical to that for the normal pipeline. +## Comments starting with keyword "BBTFNT" have been added at places +## relevant to the exercise. + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments +## BBTFNT: For modified branch prediction, need to distinguish +## conditional vs. unconditional branches +##### Jump conditions referenced explicitly +wordsig UNCOND 'C_YES' # Unconditional transfer + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + M_icode != IJXX || M_ifun == UNCOND : F_predPC; + # Mispredicted branch. Fetch at incremented PC + M_valA < M_valE && M_Cnd : M_valE; + M_valA > M_valE && !M_Cnd : M_valA; + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + # BBTFNT: This is where you'll change the branch prediction rule + f_icode == ICALL || + f_icode == IJXX && (f_ifun == UNCOND || f_valC < f_valP) : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## Forward into decode stage for valA +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + d_srcA == e_dstE : e_valE; # Forward valE from execute + d_srcA == M_dstM : m_valM; # Forward valM from memory + d_srcA == M_dstE : M_valE; # Forward valE from memory + d_srcA == W_dstM : W_valM; # Forward valM from write back + d_srcA == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalA; # Use value read from register file +]; + +word d_valB = [ + d_srcB == e_dstE : e_valE; # Forward valE from execute + d_srcB == M_dstM : m_valM; # Forward valM from memory + d_srcB == M_dstE : M_valE; # Forward valE from memory + d_srcB == W_dstM : W_valM; # Forward valM from write back + d_srcB == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalB; # Use value read from register file +]; + +################ Execute Stage ##################################### + +# BBTFNT: When some branches are predicted as not-taken, you need some +# way to get valC into pipeline register M, so that +# you can correct for a mispredicted branch. + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ, IJXX } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = E_valA; # Pass valA through stage + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB }; + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && E_ifun != UNCOND && + (E_valA < e_valE && e_Cnd || + E_valA > e_valE && !e_Cnd)) || + # BBTFNT: This condition will change + # Stalling at fetch while ret passes through pipeline + # but not condition for a load/use hazard + !(E_icode in { IMRMOVQ, IPOPQ } && E_dstM in { d_srcA, d_srcB }) && + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && E_ifun != UNCOND && + (E_valA < e_valE && e_Cnd || + E_valA > e_valE && !e_Cnd)) || + # BBTFNT: This condition will change + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB}; + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-full.hcl b/arch/sim/pipe/pipe-full.hcl new file mode 100644 index 0000000..1d666c5 --- /dev/null +++ b/arch/sim/pipe/pipe-full.hcl @@ -0,0 +1,374 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +## Your task is to implement the iaddq instruction +## The file contains a declaration of the icodes +## for iaddq (IIADDQ) +## Your job is to add the rest of the logic to make it work + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' +# Instruction code for iaddq instruction +wordsig IIADDQ 'I_IADDQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && !M_Cnd : M_valA; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ, IIADDQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL, IIADDQ }; + +# Predict next value of PC +word f_predPC = [ + f_icode in { IJXX, ICALL } : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ, IIADDQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ, IIADDQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## Forward into decode stage for valA +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + d_srcA == e_dstE : e_valE; # Forward valE from execute + d_srcA == M_dstM : m_valM; # Forward valM from memory + d_srcA == M_dstE : M_valE; # Forward valE from memory + d_srcA == W_dstM : W_valM; # Forward valM from write back + d_srcA == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalA; # Use value read from register file +]; + +word d_valB = [ + d_srcB == e_dstE : e_valE; # Forward valE from execute + d_srcB == M_dstM : m_valM; # Forward valM from memory + d_srcB == M_dstE : M_valE; # Forward valE from memory + d_srcB == W_dstM : W_valM; # Forward valM from write back + d_srcB == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalB; # Use value read from register file +]; + +################ Execute Stage ##################################### + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ, IIADDQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode in { IOPQ, IIADDQ } && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = [ + E_icode in { IPUSHQ, IRMMOVQ } && E_srcA == M_dstM : m_valM; + 1 : E_valA; # Use valA from stage pipe register +]; + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Conditions for a load/use hazard + ## Set this to the new load/use condition + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA) || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Conditions for a load/use hazard + ## Set this to the new load/use condition + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA); + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Stalling at fetch while ret passes through pipeline + # but not condition for a load/use hazard + !(E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA)) && + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Conditions for a load/use hazard + ## Set this to the new load/use condition + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA); + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-lf.hcl b/arch/sim/pipe/pipe-lf.hcl new file mode 100644 index 0000000..ff35563 --- /dev/null +++ b/arch/sim/pipe/pipe-lf.hcl @@ -0,0 +1,379 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +## Your task is to implement load-forwarding, where a value +## read from memory can be stored to memory by the immediately +## following instruction without stalling +## This requires modifying the definition of e_valA +## and relaxing the stall conditions. Relevant sections to change +## are shown in comments containing the keyword "LB" + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory +## LF: Carry srcA up to pipeline register M +wordsig M_srcA 'ex_mem_curr->srca' # Source A register ID + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && !M_Cnd : M_valA; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + f_icode in { IJXX, ICALL } : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## Forward into decode stage for valA +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + d_srcA == e_dstE : e_valE; # Forward valE from execute + d_srcA == M_dstM : m_valM; # Forward valM from memory + d_srcA == M_dstE : M_valE; # Forward valE from memory + d_srcA == W_dstM : W_valM; # Forward valM from write back + d_srcA == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalA; # Use value read from register file +]; + +word d_valB = [ + d_srcB == e_dstE : e_valE; # Forward valE from execute + d_srcB == M_dstM : m_valM; # Forward valM from memory + d_srcB == M_dstE : M_valE; # Forward valE from memory + d_srcB == W_dstM : W_valM; # Forward valM from write back + d_srcB == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalB; # Use value read from register file +]; + +################ Execute Stage ##################################### + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +## LB: With load forwarding, want to insert valM +## from memory stage when appropriate +## Here it is set to the default used in the normal pipeline +word e_valA = [ + E_icode in { IPUSHQ, IRMMOVQ } && E_srcA == M_dstM : m_valM; + 1 : E_valA; # Use valA from stage pipe register +]; + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Conditions for a load/use hazard + ## Set this to the new load/use condition + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA) || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Conditions for a load/use hazard + ## Set this to the new load/use condition + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA); + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Stalling at fetch while ret passes through pipeline + # but not condition for a load/use hazard + !(E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA)) && + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Conditions for a load/use hazard + ## Set this to the new load/use condition + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } && + !(D_icode in { IPUSHQ, IRMMOVQ } && E_dstM == d_srcA); + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-nobypass.hcl b/arch/sim/pipe/pipe-nobypass.hcl new file mode 100644 index 0000000..68a0352 --- /dev/null +++ b/arch/sim/pipe/pipe-nobypass.hcl @@ -0,0 +1,353 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +## Your task is to make the pipeline work without using any forwarding +## The normal bypassing logic in the file is disabled. +## You can only change the pipeline control logic at the end of this file. +## The trick is to make the pipeline stall whenever there is a data hazard. + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && !M_Cnd : M_valA; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + f_icode in { IJXX, ICALL } : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## DO NOT MODIFY THE FOLLOWING CODE. +## No forwarding. valA is either valP or value from register file +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + 1 : d_rvalA; # Use value read from register file +]; + +## No forwarding. valB is value from register file +word d_valB = d_rvalB; + +################ Execute Stage ##################################### + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = E_valA; # Pass valA through stage + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Modify the following to stall the update of pipeline register F + d_srcA != RNONE && d_srcA in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM } || + d_srcB != RNONE && d_srcB in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM } || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Modify the following to stall the instruction in decode + (d_srcA != RNONE && d_srcA in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM } || + d_srcB != RNONE && d_srcB in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM }) && + !(E_icode == IJXX && !e_Cnd); + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode } && + # but not condition for a generate/use hazard + !(d_srcA != RNONE && d_srcA in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM } || + d_srcB != RNONE && d_srcB in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM }); + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Modify the following to inject bubble into the execute stage + d_srcA != RNONE && d_srcA in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM } || + d_srcB != RNONE && d_srcB in { E_dstE, E_dstM, M_dstE, M_dstM, W_dstE, W_dstM }; + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-nt.hcl b/arch/sim/pipe/pipe-nt.hcl new file mode 100644 index 0000000..df1f0dc --- /dev/null +++ b/arch/sim/pipe/pipe-nt.hcl @@ -0,0 +1,371 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +## Your task is to modify the design so that conditional branches are +## predicted as being not-taken. The code here is nearly identical +## to that for the normal pipeline. +## Comments starting with keyword "BNT" have been added at places +## relevant to the exercise. + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments +## BNT: For modified branch prediction, need to distinguish +## conditional vs. unconditional branches +##### Jump conditions referenced explicitly +wordsig UNCOND 'C_YES' # Unconditional transfer + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && M_ifun != UNCOND && M_Cnd : M_valE; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + # BNT: This is where you'll change the branch prediction rule + f_icode == ICALL || f_icode == IJXX && f_ifun == UNCOND : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## Forward into decode stage for valA +word d_valA = [ + D_icode == ICALL : D_valP; # Use incremented PC + d_srcA == e_dstE : e_valE; # Forward valE from execute + d_srcA == M_dstM : m_valM; # Forward valM from memory + d_srcA == M_dstE : M_valE; # Forward valE from memory + d_srcA == W_dstM : W_valM; # Forward valM from write back + d_srcA == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalA; # Use value read from register file +]; + +word d_valB = [ + d_srcB == e_dstE : e_valE; # Forward valE from execute + d_srcB == M_dstM : m_valM; # Forward valM from memory + d_srcB == M_dstE : M_valE; # Forward valE from memory + d_srcB == W_dstM : W_valM; # Forward valM from write back + d_srcB == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalB; # Use value read from register file +]; + +################ Execute Stage ##################################### + +# BNT: When some branches are predicted as not-taken, you need some +# way to get valC into pipeline register M, so that +# you can correct for a mispredicted branch. + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ, IJXX } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = E_valA; # Pass valA through stage + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB }; + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && E_ifun != UNCOND && e_Cnd) || + # Stalling at fetch while ret passes through pipeline + # but not condition for a load/use hazard + !(E_icode in { IMRMOVQ, IPOPQ } && E_dstM in { d_srcA, d_srcB }) && + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && E_ifun != UNCOND && e_Cnd) || + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB}; + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe-std.hcl b/arch/sim/pipe/pipe-std.hcl new file mode 100644 index 0000000..1bc8ce8 --- /dev/null +++ b/arch/sim/pipe/pipe-std.hcl @@ -0,0 +1,356 @@ +#/* $begin pipe-all-hcl */ +#################################################################### +# HCL Description of Control for Pipelined Y86-64 Processor # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2014 # +#################################################################### + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "pipeline.h"' +quote '#include "stages.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'int main(int argc, char *argv[]){return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ########################## +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SBUB 'STAT_BUB' # Bubble in stage +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic ############## + +##### Pipeline Register F ########################################## + +wordsig F_predPC 'pc_curr->pc' # Predicted value of PC + +##### Intermediate Values in Fetch Stage ########################### + +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig f_icode 'if_id_next->icode' # (Possibly modified) instruction code +wordsig f_ifun 'if_id_next->ifun' # Fetched instruction function +wordsig f_valC 'if_id_next->valc' # Constant data of fetched instruction +wordsig f_valP 'if_id_next->valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Pipeline Register D ########################################## +wordsig D_icode 'if_id_curr->icode' # Instruction code +wordsig D_rA 'if_id_curr->ra' # rA field from instruction +wordsig D_rB 'if_id_curr->rb' # rB field from instruction +wordsig D_valP 'if_id_curr->valp' # Incremented PC + +##### Intermediate Values in Decode Stage ######################### + +wordsig d_srcA 'id_ex_next->srca' # srcA from decoded instruction +wordsig d_srcB 'id_ex_next->srcb' # srcB from decoded instruction +wordsig d_rvalA 'd_regvala' # valA read from register file +wordsig d_rvalB 'd_regvalb' # valB read from register file + +##### Pipeline Register E ########################################## +wordsig E_icode 'id_ex_curr->icode' # Instruction code +wordsig E_ifun 'id_ex_curr->ifun' # Instruction function +wordsig E_valC 'id_ex_curr->valc' # Constant data +wordsig E_srcA 'id_ex_curr->srca' # Source A register ID +wordsig E_valA 'id_ex_curr->vala' # Source A value +wordsig E_srcB 'id_ex_curr->srcb' # Source B register ID +wordsig E_valB 'id_ex_curr->valb' # Source B value +wordsig E_dstE 'id_ex_curr->deste' # Destination E register ID +wordsig E_dstM 'id_ex_curr->destm' # Destination M register ID + +##### Intermediate Values in Execute Stage ######################### +wordsig e_valE 'ex_mem_next->vale' # valE generated by ALU +boolsig e_Cnd 'ex_mem_next->takebranch' # Does condition hold? +wordsig e_dstE 'ex_mem_next->deste' # dstE (possibly modified to be RNONE) + +##### Pipeline Register M ######################### +wordsig M_stat 'ex_mem_curr->status' # Instruction status +wordsig M_icode 'ex_mem_curr->icode' # Instruction code +wordsig M_ifun 'ex_mem_curr->ifun' # Instruction function +wordsig M_valA 'ex_mem_curr->vala' # Source A value +wordsig M_dstE 'ex_mem_curr->deste' # Destination E register ID +wordsig M_valE 'ex_mem_curr->vale' # ALU E value +wordsig M_dstM 'ex_mem_curr->destm' # Destination M register ID +boolsig M_Cnd 'ex_mem_curr->takebranch' # Condition flag +boolsig dmem_error 'dmem_error' # Error signal from instruction memory + +##### Intermediate Values in Memory Stage ########################## +wordsig m_valM 'mem_wb_next->valm' # valM generated by memory +wordsig m_stat 'mem_wb_next->status' # stat (possibly modified to be SADR) + +##### Pipeline Register W ########################################## +wordsig W_stat 'mem_wb_curr->status' # Instruction status +wordsig W_icode 'mem_wb_curr->icode' # Instruction code +wordsig W_dstE 'mem_wb_curr->deste' # Destination E register ID +wordsig W_valE 'mem_wb_curr->vale' # ALU E value +wordsig W_dstM 'mem_wb_curr->destm' # Destination M register ID +wordsig W_valM 'mem_wb_curr->valm' # Memory M value + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +## What address should instruction be fetched at +word f_pc = [ + # Mispredicted branch. Fetch at incremented PC + M_icode == IJXX && !M_Cnd : M_valA; + # Completion of RET instruction + W_icode == IRET : W_valM; + # Default: Use predicted value of PC + 1 : F_predPC; +]; + +## Determine icode of fetched instruction +word f_icode = [ + imem_error : INOP; + 1: imem_icode; +]; + +# Determine ifun +word f_ifun = [ + imem_error : FNONE; + 1: imem_ifun; +]; + +# Is instruction valid? +bool instr_valid = f_icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Determine status code for fetched instruction +word f_stat = [ + imem_error: SADR; + !instr_valid : SINS; + f_icode == IHALT : SHLT; + 1 : SAOK; +]; + +# Does fetched instruction require a regid byte? +bool need_regids = + f_icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + f_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +# Predict next value of PC +word f_predPC = [ + f_icode in { IJXX, ICALL } : f_valC; + 1 : f_valP; +]; + +################ Decode Stage ###################################### + + +## What register should be used as the A source? +word d_srcA = [ + D_icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : D_rA; + D_icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word d_srcB = [ + D_icode in { IOPQ, IRMMOVQ, IMRMOVQ } : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word d_dstE = [ + D_icode in { IRRMOVQ, IIRMOVQ, IOPQ} : D_rB; + D_icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word d_dstM = [ + D_icode in { IMRMOVQ, IPOPQ } : D_rA; + 1 : RNONE; # Don't write any register +]; + +## What should be the A value? +## Forward into decode stage for valA +word d_valA = [ + D_icode in { ICALL, IJXX } : D_valP; # Use incremented PC + d_srcA == e_dstE : e_valE; # Forward valE from execute + d_srcA == M_dstM : m_valM; # Forward valM from memory + d_srcA == M_dstE : M_valE; # Forward valE from memory + d_srcA == W_dstM : W_valM; # Forward valM from write back + d_srcA == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalA; # Use value read from register file +]; + +word d_valB = [ + d_srcB == e_dstE : e_valE; # Forward valE from execute + d_srcB == M_dstM : m_valM; # Forward valM from memory + d_srcB == M_dstE : M_valE; # Forward valE from memory + d_srcB == W_dstM : W_valM; # Forward valM from write back + d_srcB == W_dstE : W_valE; # Forward valE from write back + 1 : d_rvalB; # Use value read from register file +]; + +################ Execute Stage ##################################### + +## Select input A to ALU +word aluA = [ + E_icode in { IRRMOVQ, IOPQ } : E_valA; + E_icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : E_valC; + E_icode in { ICALL, IPUSHQ } : -8; + E_icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + E_icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : E_valB; + E_icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + E_icode == IOPQ : E_ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = E_icode == IOPQ && + # State changes only during normal operation + !m_stat in { SADR, SINS, SHLT } && !W_stat in { SADR, SINS, SHLT }; + +## Generate valA in execute stage +word e_valA = E_valA; # Pass valA through stage + +## Set dstE to RNONE in event of not-taken conditional move +word e_dstE = [ + E_icode == IRRMOVQ && !e_Cnd : RNONE; + 1 : E_dstE; +]; + +################ Memory Stage ###################################### + +## Select memory address +word mem_addr = [ + M_icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : M_valE; + M_icode in { IPOPQ, IRET } : M_valA; + # Other instructions don't need address +]; + +## Set read control signal +bool mem_read = M_icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = M_icode in { IRMMOVQ, IPUSHQ, ICALL }; + +#/* $begin pipe-m_stat-hcl */ +## Update the status +word m_stat = [ + dmem_error : SADR; + 1 : M_stat; +]; +#/* $end pipe-m_stat-hcl */ + +## Set E port register ID +word w_dstE = W_dstE; + +## Set E port value +word w_valE = W_valE; + +## Set M port register ID +word w_dstM = W_dstM; + +## Set M port value +word w_valM = W_valM; + +## Update processor status +word Stat = [ + W_stat == SBUB : SAOK; + 1 : W_stat; +]; + +################ Pipeline Register Control ######################### + +# Should I stall or inject a bubble into Pipeline Register F? +# At most one of these can be true. +bool F_bubble = 0; +bool F_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB } || + # Stalling at fetch while ret passes through pipeline + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register D? +# At most one of these can be true. +bool D_stall = + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB }; + +bool D_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Stalling at fetch while ret passes through pipeline + # but not condition for a load/use hazard + !(E_icode in { IMRMOVQ, IPOPQ } && E_dstM in { d_srcA, d_srcB }) && + IRET in { D_icode, E_icode, M_icode }; + +# Should I stall or inject a bubble into Pipeline Register E? +# At most one of these can be true. +bool E_stall = 0; +bool E_bubble = + # Mispredicted branch + (E_icode == IJXX && !e_Cnd) || + # Conditions for a load/use hazard + E_icode in { IMRMOVQ, IPOPQ } && + E_dstM in { d_srcA, d_srcB}; + +# Should I stall or inject a bubble into Pipeline Register M? +# At most one of these can be true. +bool M_stall = 0; +# Start injecting bubbles as soon as exception passes through memory stage +bool M_bubble = m_stat in { SADR, SINS, SHLT } || W_stat in { SADR, SINS, SHLT }; + +# Should I stall or inject a bubble into Pipeline Register W? +bool W_stall = W_stat in { SADR, SINS, SHLT }; +bool W_bubble = 0; +#/* $end pipe-all-hcl */ diff --git a/arch/sim/pipe/pipe.tcl b/arch/sim/pipe/pipe.tcl new file mode 100755 index 0000000..3129d6c --- /dev/null +++ b/arch/sim/pipe/pipe.tcl @@ -0,0 +1,633 @@ +########################################################################## +# Parsing of command line flags # +########################################################################## + +proc flagVal {flag default} { + global argv + foreach t $argv { + if {[string match "-$flag*" $t]} {return [string range $t 2 end]} + } + return $default +} + +proc findFlag {flag} { + global argv + foreach t $argv { + if {[string match "-$flag" $t]} {return 1} + } + return 0 +} + +########################################################################## +# Register File Implementation. Shown as array of 3 X 5 # +########################################################################## + + +# Font used to display register contents +set fontSize [expr 10 * [flagVal "f" 12]] +set codeFontSize [expr 10 * [flagVal "c" 10]] +set labFontSize [expr 10 * [flagVal "l" 10]] +set bigFontSize [expr 10 * [flagVal "b" 16]] +set dpyFont "*-courier-medium-r-normal--*-$fontSize-*-*-*-*-*-*" +set labFont "*-helvetica-medium-r-normal--*-$labFontSize-*-*-*-*-*-*" +set bigLabFont "*-helvetica-bold-r-normal--*-$bigFontSize-*-*-*-*-*-*" +set codeFont "*-courier-medium-r-normal--*-$codeFontSize-*-*-*-*-*-*" +# Background Color of normal register +set normalBg white +# Background Color of highlighted register +set specialBg LightSkyBlue + +# Height of titles separating major sections of control panel +set sectionHeight 2 + + +# How many rows of code do I display +set codeRowCount [flagVal "r" 50] + +# Keep track of previous highlighted register +set lastId -1 +proc setReg {id val highlight} { + global lastId normalBg specialBg + if {$lastId >= 0} { + .r.reg$lastId config -bg $normalBg + set lastId -1 + } + if {$id < 0 || $id >= 15} { + error "Invalid Register ($id)" + } + .r.reg$id config -text [format %16x $val] + if {$highlight} { + uplevel .r.reg$id config -bg $specialBg + set lastId $id + } +} + +# Clear all registers +proc clearReg {} { + global lastId normalBg + if {$lastId >= 0} { + .r.reg$lastId config -bg $normalBg + set lastId -1 + } + for {set i 0} {$i < 8} {incr i 1} { + .r.reg$i config -text "" + } +} + +# Set all 3 condition codes +proc setCC {zv cv ov} { + .cc.cc0 config -text [format %d $zv] + .cc.cc1 config -text [format %d $cv] + .cc.cc2 config -text [format %d $ov] +} + +# Set CPI display +proc showCPI {cycles instructions cpi} { + .cpi.cyc config -text [format %d $cycles] + .cpi.instr config -text [format %d $instructions] + .cpi.cpi config -text [format %.2f $cpi] +} + +# Set status display +proc showStat {s} { + .stat.val config -text $s +} + +############################################################################## +# CPI Display +############################################################################## +# Create Window for CPI display +frame .cpi +pack .cpi -in . -side bottom + +label .cpi.lab -text "Performance" -font $bigLabFont -height $sectionHeight +pack .cpi.lab -in .cpi -side left + +label .cpi.clab -text "Cycles" -font $labFont +pack .cpi.clab -in .cpi -side left +label .cpi.cyc -text "0" -width 6 -font $dpyFont -relief ridge -bg $normalBg +pack .cpi.cyc -in .cpi -side left + +label .cpi.ilab -text "Instructions" -font $labFont +pack .cpi.ilab -in .cpi -side left +label .cpi.instr -text "0" -width 6 -font $dpyFont -relief ridge -bg $normalBg +pack .cpi.instr -in .cpi -side left + +label .cpi.cpilab -text "CPI" -font $labFont +pack .cpi.cpilab -in .cpi -side left +label .cpi.cpi -text "1.0" -width 5 -font $dpyFont -relief ridge -bg $normalBg +pack .cpi.cpi -in .cpi -side left + +############################################################################## +# Status Display # +############################################################################## +# Create Window for processor status (packed next to condition codes) +frame .stat +pack .stat -in . -side bottom + +label .stat.lab -text "Stat" -width 7 -font $bigLabFont -height $sectionHeight +label .stat.val -width 3 -font $dpyFont -relief ridge -bg $normalBg +label .stat.fill -width 6 -text "" +pack .stat.lab .stat.val .stat.fill -in .stat -side left + + +############################################################################## +# Condition Code Display # +############################################################################## +# Create Window for condition codes +frame .cc +pack .cc -in .stat -side left + +label .cc.lab -text "Condition Codes" -font $bigLabFont -height $sectionHeight +pack .cc.lab -in .cc -side left + + +set ccnames [list "Z" "S" "O"] + +# Create Row of CC Labels +for {set i 0} {$i < 3} {incr i 1} { + label .cc.lab$i -width 1 -font $dpyFont -text [lindex $ccnames $i] + pack .cc.lab$i -in .cc -side left + label .cc.cc$i -width 1 -font $dpyFont -relief ridge -bg $normalBg + pack .cc.cc$i -in .cc -side left +} + +############################################################################## +# Register Display # +############################################################################## + + +# Create Window for registers +frame .r +pack .r -in . -side bottom +# Following give separate window for register file +# toplevel .r +# wm title .r "Register File" +label .r.lab -text "Register File" -font $bigLabFont -height $sectionHeight +pack .r.lab -in .r -side top +# Set up top row control panel (disabled) +# frame .r.cntl +# pack .r.cntl -fill x -in .r +# label .r.labreg -text "Register" -width 10 +# entry .r.regid -width 3 -relief sunken -textvariable regId -font $dpyFont +# label .r.labval -text "Value" -width 10 +# entry .r.regval -width 8 -relief sunken -textvariable regVal -font $dpyFont +# button .r.doset -text "Set" -command {setReg $regId $regVal 1} -width 6 +# button .r.c -text "Clear" -command clearReg -width 6 +# pack .r.labreg .r.regid .r.labval .r.regval .r.doset .r.c -in .r.cntl -side left + +set regnames [list "%rax" "%rcx" "%rdx" "%rbx" "%rsp" "%rbp" "%rsi" "%rdi" "%r8 " "%r9 " "%r10" "%r11" "%r12" "%r13" "%r14" ""] + +# Create rows of register labels and displays +for {set j 0} {$j < 3} {incr j 1} { + frame .r.labels$j + pack .r.labels$j -side top -in .r + + for {set c 0} {$c < 5} {incr c 1} { + set i [expr $j * 5 + $c] + label .r.lab$i -width 16 -font $dpyFont -text [lindex $regnames $i] + pack .r.lab$i -in .r.labels$j -side left + } + + # Create Row of Register Entries + frame .r.row$j + pack .r.row$j -side top -in .r + + # Create 5 registers + for {set c 0} {$c < 5} {incr c 1} { + set i [expr $j * 5 + $c] + if {$i == 15} { + label .r.reg$i -width 16 -font $dpyFont -text "" + } else { + label .r.reg$i -width 16 -font $dpyFont -relief ridge \ + -bg $normalBg + } + pack .r.reg$i -in .r.row$j -side left + } + +} + + +############################################################################## +# Main Control Panel # +############################################################################## +# +# Set the simulator name (defined in simname in ssim.c) +# as the title of the main window +# +wm title . $simname + +# Control Panel for simulator +set cntlBW 12 +frame .cntl +pack .cntl +button .cntl.quit -width $cntlBW -text Quit -command exit +button .cntl.run -width $cntlBW -text Go -command simGo +button .cntl.stop -width $cntlBW -text Stop -command simStop +button .cntl.step -width $cntlBW -text Step -command simStep +button .cntl.reset -width $cntlBW -text Reset -command simResetAll +pack .cntl.quit .cntl.run .cntl.stop .cntl.step .cntl.reset -in .cntl -side left +# Simulation speed control +scale .spd -label {Simulator Speed (10*log Hz)} -from -10 -to 30 -length 10c \ + -orient horizontal -command setSpeed +pack .spd + +# Simulation mode +set simMode forward + +frame .md +### Old Simulation mode stuff +#pack .md +#radiobutton .md.wedged -text Wedged -variable simMode \ +# -value wedged -width 10 -command {setSimMode wedged} +#radiobutton .md.stall -text Stall -variable simMode \ +# -value stall -width 10 -command {setSimMode stall} +#radiobutton .md.forward -text Forward -variable simMode \ +# -value forward -width 10 -command {setSimMode forward} +#pack .md.wedged .md.stall .md.forward -in .md -side left + + +# simDelay defines number of milliseconds for each cycle of simulator +# Initial value is 1000ms +set simDelay 1000 +# Set delay based on rate expressed in log(Hz) +proc setSpeed {rate} { + global simDelay + set simDelay [expr round(1000 / pow(10,$rate/10.0))] +} + +# Global variables controlling simulator execution +# Should simulator be running now? +set simGoOK 0 + +proc simStop {} { + global simGoOK + set simGoOK 0 +} + +proc simStep {} { + global simStat + set simStat [simRun 1] +} + +proc simGo {} { + global simGoOK simDelay simStat + set simGoOK 1 + # Disable the Go and Step buttons + # Enable the Stop button + while {$simGoOK} { + # run the simulator 1 cycle + after $simDelay + set simStat [simRun 1] + if {$simStat != "AOK" && $simStat != "BUB"} {set simGoOK 0} + update + } + # Disable the Stop button + # Enable the Go and Step buttons +} + +############################################################################## +# Pipe Register Display # +############################################################################## + +# Colors for Highlighting Data Sources +set valaBg LightPink +set valbBg PaleGreen1 + +# Overall width of pipe register display +set pipeWidth 72 +set pipeHeight 2 +set labWidth 5 + +# Add labeled display to window +proc addDisp {win width name} { + global dpyFont labFont + set lname [string tolower $name] + frame $win.$lname + pack $win.$lname -in $win -side left + label $win.$lname.t -text $name -font $labFont + label $win.$lname.n -width $width -font $dpyFont -bg lightgray -fg Black + label $win.$lname.c -width $width -font $dpyFont -bg white -relief ridge + pack $win.$lname.t $win.$lname.c $win.$lname.n -in $win.$lname -side top + return [list $win.$lname.n $win.$lname.c] +} + +# Set text in display row +proc setDisp {wins txts} { + for {set i 0} {$i < [llength $wins] && $i < [llength $txts]} {incr i} { + set win [lindex $wins $i] + set txt [lindex $txts $i] + $win config -text $txt + } +} + +frame .p -width $pipeWidth +pack .p -in . -side bottom +label .p.lab -text "Pipeline Registers" -font $bigLabFont -height $sectionHeight +pack .p.lab -in .p -side top +label .p.mem -text "Memory Stage" -height $pipeHeight -width $pipeWidth -bg NavyBlue -fg White -font $bigLabFont +label .p.ex -text "Execute Stage" -height $pipeHeight -width $pipeWidth -bg NavyBlue -fg White -font $bigLabFont +label .p.id -text "Decode Stage" -height $pipeHeight -width $pipeWidth -bg NavyBlue -fg White -font $bigLabFont +label .p.if -text "Fetch Stage" -height $pipeHeight -width $pipeWidth -bg NavyBlue -fg White -font $bigLabFont +frame .p.mw +frame .p.em +frame .p.de +frame .p.fd +frame .p.pc +frame .p.e +pack .p.mw .p.mem .p.em .p.ex .p.e .p.de .p.id .p.fd .p.if .p.pc -in .p -side top -anchor w -expand 1 + +proc addLabel { win nstage cstage } { + global labWidth labFont bigLabFont + frame $win.lab + label $win.name -text "$cstage" -width $labWidth -font $bigLabFont + pack $win.name -in $win.lab -side left + + label $win.lab.t -text " " -font $labFont + label $win.lab.n -width $labWidth -text "Input" -anchor w + label $win.lab.c -width $labWidth -text "State" -anchor w + pack $win.lab.t $win.lab.c $win.lab.n -in $win.lab -side top + pack $win.lab -in $win -side left +} + +addLabel .p.mw M W +addLabel .p.em E M +addLabel .p.de D E +addLabel .p.fd F D +addLabel .p.pc "" F + +proc addFill { win w } { + frame $win.fill + label $win.fill.t -text "" -width $w -bg lightgray + label $win.fill.n -bg white -text "" -width $w -bg lightgray + label $win.fill.c -bg white -text "" -width $w -bg lightgray + pack $win.fill.c $win.fill.t $win.fill.n -in $win.fill -side top -expand 1 + pack $win.fill -in $win -side right -expand 1 +} + +addFill .p.mw 0 +addFill .p.de 0 +addFill .p.fd 0 +addFill .p.pc 0 + +# Take list of lists, and transpose nesting +# Assumes all lists are of same length +proc ltranspose {inlist} { + set result {} + for {set i 0} {$i < [llength [lindex $inlist 0]]} {incr i} { + set nlist {} + for {set j 0} {$j < [llength $inlist]} {incr j} { + set ele [lindex [lindex $inlist $j] $i] + set nlist [concat $nlist [list $ele]] + } + set result [concat $result [list $nlist]] + } + return $result +} + +# Fields in F display +# Total size = 3+16 = 19 +set pwins(F) [ltranspose [list [addDisp .p.pc 3 Stat] \ + [addDisp .p.pc 16 predPC]]] + +# Fields in D display +# Total size = 3+6+4+4+16+16 = 49 +set pwins(D) [ltranspose \ + [list [addDisp .p.fd 3 Stat] \ + [addDisp .p.fd 6 Instr] \ + [addDisp .p.fd 4 rA] \ + [addDisp .p.fd 4 rB] \ + [addDisp .p.fd 16 valC] \ + [addDisp .p.fd 16 valP]]] + +# Fields in E Display +# Total size = 3+6+16+16+16+4+4+4+4 = 73 +set pwins(E) [ltranspose \ + [list [addDisp .p.de 3 Stat] \ + [addDisp .p.de 6 Instr] \ + [addDisp .p.de 16 valC] \ + [addDisp .p.de 16 valA] \ + [addDisp .p.de 16 valB] \ + [addDisp .p.de 4 dstE] \ + [addDisp .p.de 4 dstM] \ + [addDisp .p.de 4 srcA] \ + [addDisp .p.de 4 srcB]]] + +# Fields in M Display +# Total size = 3+6+3+16+16+4+4 = 52 +set pwins(M) [ltranspose \ + [list [addDisp .p.em 3 Stat] \ + [addDisp .p.em 6 Instr] \ + [addDisp .p.em 3 Cnd] \ + [addDisp .p.em 16 valE] \ + [addDisp .p.em 16 valA] \ + [addDisp .p.em 4 dstE] \ + [addDisp .p.em 4 dstM]]] +# Fields in W display +# Total size = 3+6+16+16+4+4 = 49 +set pwins(W) [ltranspose \ + [list [addDisp .p.mw 3 Stat] \ + [addDisp .p.mw 6 Instr] \ + [addDisp .p.mw 16 valE] \ + [addDisp .p.mw 16 valM] \ + [addDisp .p.mw 4 dstE] \ + [addDisp .p.mw 4 dstM]]] + +# update status line for specified pipe register +proc updateStage {name current txts} { + set Name [string toupper $name] + global pwins + set wins [lindex $pwins($Name) $current] + setDisp $wins $txts +} + +# Create Array of windows corresponding to data sources +set rwins(wm) .p.mw.valm.c +set rwins(we) .p.mw.vale.c +set rwins(me) .p.em.vale.c +set rwins(ea) .p.de.vala.c +set rwins(eb) .p.de.valb.c + +# Highlight Data Source Registers for valA, valB +proc showSources { a b } { + global rwins valaBg valbBg + # Set them all to white + foreach w [array names rwins] { + $rwins($w) config -bg White + } + if {$a != "none"} { $rwins($a) config -bg $valaBg } + if {$b != "none"} { $rwins($b) config -bg $valbBg } + + # Indicate forwarding destinations by their color + .p.de.vala.t config -bg $valaBg + .p.de.valb.t config -bg $valbBg +} + +########################################################################## +# Instruction Display # +########################################################################## + +toplevel .c +wm title .c "Program Code" +frame .c.cntl +pack .c.cntl -in .c -side top -anchor w +label .c.filelab -width 10 -text "File" +entry .c.filename -width 20 -relief sunken -textvariable codeFile \ + -font $dpyFont -bg white +button .c.loadbutton -width $cntlBW -command {loadCode $codeFile} -text Load +pack .c.filelab .c.filename .c.loadbutton -in .c.cntl -side left + +proc clearCode {} { + simLabel {} {} + destroy .c.t + destroy .c.tr +} + +proc createCode {} { + # Create Code Structure + frame .c.t + pack .c.t -in .c -side top -anchor w + # Support up to 4 columns of code, each $codeRowCount lines long + frame .c.tr + pack .c.tr -in .c.t -side top -anchor nw +} + +proc loadCode {file} { + # Kill old code window + clearCode + # Create new one + createCode + simCode $file + simResetAll +} + +# Start with initial code window, even though it will be destroyed. +createCode + +# Add a line of code to the display +proc addCodeLine {line addr op text} { + global codeRowCount + # Create new line in display + global codeFont + frame .c.tr.$addr + pack .c.tr.$addr -in .c.tr -side top -anchor w + label .c.tr.$addr.a -width 6 -text [format "0x%x" $addr] -font $codeFont + label .c.tr.$addr.i -width 20 -text $op -font $codeFont + label .c.tr.$addr.s -width 2 -text "" -font $codeFont -bg white + label .c.tr.$addr.t -text $text -font $codeFont + pack .c.tr.$addr.a .c.tr.$addr.i .c.tr.$addr.s \ + .c.tr.$addr.t -in .c.tr.$addr -side left +} + +# Keep track of which instructions have stage labels + +set oldAddr {} + +proc simLabel {addrs labs} { + global oldAddr + set newAddr {} + # Clear away any old labels + foreach a $oldAddr { + .c.tr.$a.s config -text "" + } + for {set i 0} {$i < [llength $addrs]} {incr i} { + set a [lindex $addrs $i] + set t [lindex $labs $i] + if {[winfo exists .c.tr.$a]} { + .c.tr.$a.s config -text $t + set newAddr [concat $newAddr $a] + } + } + set oldAddr $newAddr +} + +proc simResetAll {} { + global simStat + set simStat "AOK" + simReset + clearMem + simLabel {} {} +} + +############################################################################### +# Memory Display # +############################################################################### +toplevel .m +wm title .m "Memory Contents" +frame .m.t +pack .m.t -in .m -side top -anchor w + +label .m.t.lab -width 6 -font $dpyFont -text " " +pack .m.t.lab -in .m.t -side left +for {set i 0} {$i < 16} {incr i 8} { + label .m.t.a$i -width 16 -font $dpyFont -text [format " 0x---%x" [expr $i % 16]] + pack .m.t.a$i -in .m.t -side left +} + + +# Keep track of range of addresses currently displayed +set minAddr 0 +set memCnt 0 +set haveMem 0 + +proc createMem {nminAddr nmemCnt} { + global minAddr memCnt haveMem codeFont dpyFont normalBg + set minAddr $nminAddr + set memCnt $nmemCnt + + if { $haveMem } { destroy .m.e } + + # Create Memory Structure + frame .m.e + set haveMem 1 + pack .m.e -in .m -side top -anchor w + # Now fill it with values + for {set i 0} {$i < $memCnt} {incr i 16} { + set addr [expr $minAddr + $i] + + frame .m.e.r$i + pack .m.e.r$i -side bottom -in .m.e + label .m.e.r$i.lab -width 6 -font $dpyFont -text [format "0x%.3x-" [expr $addr / 16]] + pack .m.e.r$i.lab -in .m.e.r$i -side left + + for {set j 0} {$j < 16} {incr j 8} { + set a [expr $addr + $j] + label .m.e.v$a -width 16 -font $dpyFont -relief ridge \ + -bg $normalBg + pack .m.e.v$a -in .m.e.r$i -side left + } + } +} + +proc setMem {Addr Val} { + global minAddr memCnt + if {$Addr < $minAddr || $Addr > [expr $minAddr + $memCnt]} { + error "Memory address $Addr out of range" + } + .m.e.v$Addr config -text [format %16x $Val] +} + +proc clearMem {} { + destroy .m.e + createMem 0 0 +} + + + +############################################################################### +# Command Line Initialization # +############################################################################### + +# Get code file name from input + +# Find file with specified extension +proc findFile {tlist ext} { + foreach t $tlist { + if {[string match "*.$ext" $t]} {return $t} + } + return "" +} + + +set codeFile [findFile $argv yo] +if {$codeFile != ""} { loadCode $codeFile} diff --git a/arch/sim/pipe/pipeline.h b/arch/sim/pipe/pipeline.h new file mode 100644 index 0000000..61eb239 --- /dev/null +++ b/arch/sim/pipe/pipeline.h @@ -0,0 +1,67 @@ +/****************************************************************************** + * pipe.h + * + * Code for implementing pipelined processor simulators + ******************************************************************************/ + +#ifndef PIPE_H +#define PIPE_H + +/****************************************************************************** + * #includes + ******************************************************************************/ + +#include + +/****************************************************************************** + * typedefs + ******************************************************************************/ + +/* Different control operations for pipeline register */ +/* LOAD: Copy next state to current */ +/* STALL: Keep current state unchanged */ +/* BUBBLE: Set current state to nop */ +/* ERROR: Occurs when both stall & load signals set */ + +typedef enum { P_LOAD, P_STALL, P_BUBBLE, P_ERROR } p_stat_t; + +typedef struct { + /* Current and next register state */ + void *current; + void *next; + /* Contents of register when bubble occurs */ + void *bubble_val; + /* Number of state bytes */ + int count; + /* How should state be updated next time? */ + p_stat_t op; +} pipe_ele, *pipe_ptr; + +/****************************************************************************** + * function declarations + ******************************************************************************/ + +/* Create new pipe with count bytes of state */ +/* bubble_val indicates state corresponding to pipeline bubble */ +pipe_ptr new_pipe(int count, void *bubble_val); + +/* Update all pipes */ +void update_pipes(); + +/* Set all pipes to bubble values */ +void clear_pipes(); + +/* Utility code */ + +/* Print hex/oct/binary format with leading zeros */ +/* bpd denotes bits per digit Should be in range 1-4, + bpw denotes bits per word.*/ +void wprint(uword_t x, int bpd, int bpw, FILE *fp); +void wstring(uword_t x, int bpd, int bpw, char *s); + +/******************************************************************************/ + +#endif /* PIPE_H */ + + + diff --git a/arch/sim/pipe/psim.c b/arch/sim/pipe/psim.c new file mode 100644 index 0000000..c08508e --- /dev/null +++ b/arch/sim/pipe/psim.c @@ -0,0 +1,1604 @@ +/************************************************************************** + * psim.c - Pipelined Y86-64 simulator + * + * Copyright (c) 2010, 2015. Bryant and D. O'Hallaron, All rights reserved. + * May not be used, modified, or copied without permission. + **************************************************************************/ + +#include +#include +#include +#include +#include + +#include "isa.h" +#include "pipeline.h" +#include "stages.h" +#include "sim.h" + +#define MAXBUF 1024 +#define DEFAULTNAME "Y86-64 Simulator: " + +#ifdef HAS_GUI +#include +#endif /* HAS_GUI */ + +#define MAXARGS 128 +#define MAXBUF 1024 +#define TKARGS 3 + + +/*************** + * Begin Globals + ***************/ + +/* Simulator name defined and initialized by the compiled HCL file */ +/* according to the -n argument supplied to hcl2c */ +extern char simname[]; + +/* Parameters modifed by the command line */ +int gui_mode = FALSE; /* Run in GUI mode instead of TTY mode? (-g) */ +char *object_filename; /* The input object file name. */ +FILE *object_file; /* Input file handle */ +bool_t verbosity = 2; /* Verbosity level [TTY only] (-v) */ +word_t instr_limit = 10000; /* Instruction limit [TTY only] (-l) */ +bool_t do_check = FALSE; /* Test with ISA simulator? [TTY only] (-t) */ + +/************* + * End Globals + *************/ + + +/*************************** + * Begin function prototypes + ***************************/ + +word_t sim_run_pipe(word_t max_instr, word_t max_cycle, byte_t *statusp, cc_t *ccp); +static void usage(char *name); /* Print helpful usage message */ +static void run_tty_sim(); /* Run simulator in TTY mode */ + +#ifdef HAS_GUI +void addAppCommands(Tcl_Interp *interp); /* Add application-dependent commands */ +#endif /* HAS_GUI */ + +/************************* + * End function prototypes + *************************/ + + +/******************************************************************* + * Part 1: This part is the initial entry point that handles general + * initialization. It parses the command line and does any necessary + * setup to run in either TTY or GUI mode, and then starts the + * simulation. + *******************************************************************/ + +/* + * sim_main - main simulator routine. This function is called from the + * main() routine in the HCL file. + */ +int sim_main(int argc, char **argv) +{ + int i; + int c; + char *myargv[MAXARGS]; + + /* Parse the command line arguments */ + while ((c = getopt(argc, argv, "htgl:v:")) != -1) { + switch(c) { + case 'h': + usage(argv[0]); + break; + case 'l': + instr_limit = atoll(optarg); + break; + case 'v': + verbosity = atoi(optarg); + if (verbosity < 0 || verbosity > 2) { + printf("Invalid verbosity %d\n", verbosity); + usage(argv[0]); + } + break; + case 't': + do_check = TRUE; + break; + case 'g': + gui_mode = TRUE; + break; + default: + printf("Invalid option '%c'\n", c); + usage(argv[0]); + break; + } + } + + + /* Do we have too many arguments? */ + if (optind < argc - 1) { + printf("Too many command line arguments:"); + for (i = optind; i < argc; i++) + printf(" %s", argv[i]); + printf("\n"); + usage(argv[0]); + } + + + /* The single unflagged argument should be the object file name */ + object_filename = NULL; + object_file = NULL; + if (optind < argc) { + object_filename = argv[optind]; + object_file = fopen(object_filename, "r"); + if (!object_file) { + fprintf(stderr, "Couldn't open object file %s\n", object_filename); + exit(1); + } + } + + + /* Run the simulator in GUI mode (-g flag) */ + if (gui_mode) { + +#ifndef HAS_GUI + printf("To run in GUI mode, you must recompile with the HAS_GUI constant defined.\n"); + exit(1); +#endif /* HAS_GUI */ + + /* In GUI mode, we must specify the object file on command line */ + if (!object_file) { + printf("Missing object file argument in GUI mode\n"); + usage(argv[0]); + } + + /* Build the command line for the GUI simulator */ + for (i = 0; i < TKARGS; i++) { + if ((myargv[i] = malloc(MAXBUF*sizeof(char))) == NULL) { + perror("malloc error"); + exit(1); + } + } + strcpy(myargv[0], argv[0]); + strcpy(myargv[1], "pipe.tcl"); + strcpy(myargv[2], object_filename); + myargv[3] = NULL; + + /* Start the GUI simulator */ +#ifdef HAS_GUI + Tk_Main(TKARGS, myargv, Tcl_AppInit); +#endif /* HAS_GUI */ + exit(0); + } + + /* Otherwise, run the simulator in TTY mode (no -g flag) */ + run_tty_sim(); + + exit(0); +} + +/* + * run_tty_sim - Run the simulator in TTY mode + */ +static void run_tty_sim() +{ + word_t icount = 0; + byte_t run_status = STAT_AOK; + cc_t result_cc = 0; + word_t byte_cnt = 0; + mem_t mem0, reg0; + state_ptr isa_state = NULL; + + + /* In TTY mode, the default object file comes from stdin */ + if (!object_file) { + object_file = stdin; + } + + if (verbosity >= 2) + sim_set_dumpfile(stdout); + sim_init(); + + /* Emit simulator name */ + if (verbosity >= 2) + printf("%s\n", simname); + + byte_cnt = load_mem(mem, object_file, 1); + if (byte_cnt == 0) { + fprintf(stderr, "No lines of code found\n"); + exit(1); + } else if (verbosity >= 2) { + printf("%lld bytes of code read\n", byte_cnt); + } + fclose(object_file); + if (do_check) { + isa_state = new_state(0); + free_mem(isa_state->r); + free_mem(isa_state->m); + isa_state->m = copy_mem(mem); + isa_state->r = copy_mem(reg); + isa_state->cc = cc; + } + + mem0 = copy_mem(mem); + reg0 = copy_mem(reg); + + icount = sim_run_pipe(instr_limit, 5*instr_limit, &run_status, &result_cc); + if (verbosity > 0) { + printf("%lld instructions executed\n", icount); + printf("Status = %s\n", stat_name(run_status)); + printf("Condition Codes: %s\n", cc_name(result_cc)); + printf("Changed Register State:\n"); + diff_reg(reg0, reg, stdout); + printf("Changed Memory State:\n"); + diff_mem(mem0, mem, stdout); + } + if (do_check) { + byte_t e = STAT_AOK; + word_t step; + bool_t match = TRUE; + + for (step = 0; step < instr_limit && e == STAT_AOK; step++) { + e = step_state(isa_state, stdout); + } + + if (diff_reg(isa_state->r, reg, NULL)) { + match = FALSE; + if (verbosity > 0) { + printf("ISA Register != Pipeline Register File\n"); + diff_reg(isa_state->r, reg, stdout); + } + } + if (diff_mem(isa_state->m, mem, NULL)) { + match = FALSE; + if (verbosity > 0) { + printf("ISA Memory != Pipeline Memory\n"); + diff_mem(isa_state->m, mem, stdout); + } + } + if (isa_state->cc != result_cc) { + match = FALSE; + if (verbosity > 0) { + printf("ISA Cond. Codes (%s) != Pipeline Cond. Codes (%s)\n", + cc_name(isa_state->cc), cc_name(result_cc)); + } + } + if (match) { + printf("ISA Check Succeeds\n"); + } else { + printf("ISA Check Fails\n"); + } + } + + /* Emit CPI statistics */ + { + double cpi = instructions > 0 ? (double) cycles/instructions : 1.0; + printf("CPI: %lld cycles/%lld instructions = %.2f\n", + cycles, instructions, cpi); + } + +} + +/* + * usage - print helpful diagnostic information + */ +static void usage(char *name) +{ + printf("Usage: %s [-htg] [-l m] [-v n] file.yo\n", name); + printf("file.yo arg required in GUI mode, optional in TTY mode (default stdin)\n"); + printf(" -h Print this message\n"); + printf(" -g Run in GUI mode instead of TTY mode (default TTY)\n"); + printf(" -l m Set instruction limit to m [TTY mode only] (default %lld)\n", instr_limit); + printf(" -v n Set verbosity level to 0 <= n <= 2 [TTY mode only] (default %d)\n", verbosity); + printf(" -t Test result against ISA simulator [TTY mode only]\n"); + exit(0); +} + + +/********************************************************* + * Part 2: This part contains the core simulator routines. + *********************************************************/ + + +/***************** + * Part 2 Globals + *****************/ + +/* Performance monitoring */ +/* How many cycles have been simulated? */ +word_t cycles = 0; +/* How many instructions have passed through the WB stage? */ +word_t instructions = 0; + +/* Has simulator gotten past initial bubbles? */ +static int starting_up = 1; + + + +/* Both instruction and data memory */ +mem_t mem; +word_t minAddr = 0; +word_t memCnt = 0; + +/* Register file */ +mem_t reg; +/* Condition code register */ +cc_t cc; +/* Status code */ +stat_t status; + + +/* Pending updates to state */ +word_t cc_in = DEFAULT_CC; +word_t wb_destE = REG_NONE; +word_t wb_valE = 0; +word_t wb_destM = REG_NONE; +word_t wb_valM = 0; +word_t mem_addr = 0; +word_t mem_data = 0; +bool_t mem_write = FALSE; + +/* EX Operand sources */ +mux_source_t amux = MUX_NONE; +mux_source_t bmux = MUX_NONE; + +/* Current and next states of all pipeline registers */ +pc_ptr pc_curr; +if_id_ptr if_id_curr; +id_ex_ptr id_ex_curr; +ex_mem_ptr ex_mem_curr; +mem_wb_ptr mem_wb_curr; + +pc_ptr pc_next; +if_id_ptr if_id_next; +id_ex_ptr id_ex_next; +ex_mem_ptr ex_mem_next; +mem_wb_ptr mem_wb_next; + +/* Intermediate values */ +word_t f_pc; +byte_t imem_icode; +byte_t imem_ifun; +bool_t imem_error; +bool_t instr_valid; +word_t d_regvala; +word_t d_regvalb; +word_t e_vala; +word_t e_valb; +bool_t e_bcond; +bool_t dmem_error; + +/* The pipeline state */ +pipe_ptr pc_state, if_id_state, id_ex_state, ex_mem_state, mem_wb_state; + +/* Simulator operating mode */ +sim_mode_t sim_mode = S_FORWARD; +/* Log file */ +FILE *dumpfile = NULL; + +/***************************************************************************** + * reporting code + *****************************************************************************/ + +#ifdef HAS_GUI +/* used for formatting instructions */ +static char status_msg[128]; + +static char *format_pc(pc_ptr state) +{ + char pstring[17]; + wstring(state->pc, 4, 64, pstring); + sprintf(status_msg, "%s %s", stat_name(state->status), pstring); + return status_msg; +} + +static char *format_if_id(if_id_ptr state) +{ + char valcstring[17]; + char valpstring[17]; + wstring(state->valc, 4, 64, valcstring); + wstring(state->valp, 4, 64, valpstring); + sprintf(status_msg, "%s %s %s %s %s %s", + stat_name(state->status), + iname(HPACK(state->icode,state->ifun)), + reg_name(state->ra), + reg_name(state->rb), + valcstring, + valpstring); + return status_msg; +} + +static char *format_id_ex(id_ex_ptr state) +{ + char valcstring[17]; + char valastring[17]; + char valbstring[17]; + wstring(state->valc, 4, 64, valcstring); + wstring(state->vala, 4, 64, valastring); + wstring(state->valb, 4, 64, valbstring); + sprintf(status_msg, "%s %s %s %s %s %s %s %s %s", + stat_name(state->status), + iname(HPACK(state->icode, state->ifun)), + valcstring, + valastring, + valbstring, + reg_name(state->deste), + reg_name(state->destm), + reg_name(state->srca), + reg_name(state->srcb)); + return status_msg; +} + +static char *format_ex_mem(ex_mem_ptr state) +{ + char valestring[17]; + char valastring[17]; + wstring(state->vale, 4, 64, valestring); + wstring(state->vala, 4, 64, valastring); + sprintf(status_msg, "%s %s %c %s %s %s %s", + stat_name(state->status), + iname(HPACK(state->icode, state->ifun)), + state->takebranch ? 'Y' : 'N', + valestring, + valastring, + reg_name(state->deste), + reg_name(state->destm)); + + return status_msg; +} + +static char *format_mem_wb(mem_wb_ptr state) +{ + char valestring[17]; + char valmstring[17]; + wstring(state->vale, 4, 64, valestring); + wstring(state->valm, 4, 64, valmstring); + sprintf(status_msg, "%s %s %s %s %s %s", + stat_name(state->status), + iname(HPACK(state->icode, state->ifun)), + valestring, + valmstring, + reg_name(state->deste), + reg_name(state->destm)); + + return status_msg; +} +#endif /* HAS_GUI */ + +/* Report system state */ +static void sim_report() +{ + +#ifdef HAS_GUI + if (gui_mode) { + report_pc(f_pc, pc_curr->status != STAT_BUB, + if_id_curr->stage_pc, if_id_curr->status != STAT_BUB, + id_ex_curr->stage_pc, id_ex_curr->status != STAT_BUB, + ex_mem_curr->stage_pc, ex_mem_curr->status != STAT_BUB, + mem_wb_curr->stage_pc, mem_wb_curr->status != STAT_BUB); + report_state("F", 0, format_pc(pc_next)); + report_state("F", 1, format_pc(pc_curr)); + report_state("D", 0, format_if_id(if_id_next)); + report_state("D", 1, format_if_id(if_id_curr)); + report_state("E", 0, format_id_ex(id_ex_next)); + report_state("E", 1, format_id_ex(id_ex_curr)); + report_state("M", 0, format_ex_mem(ex_mem_next)); + report_state("M", 1, format_ex_mem(ex_mem_curr)); + report_state("W", 0, format_mem_wb(mem_wb_next)); + report_state("W", 1, format_mem_wb(mem_wb_curr)); + /* signal_sources(); */ + show_cc(cc); + show_stat(status); + show_cpi(); + } +#endif + +} + +/***************************************************************************** + * pipeline control + * These functions can be used to handle hazards + *****************************************************************************/ + +/* bubble stage (has effect at next update) */ +void sim_bubble_stage(stage_id_t stage) +{ + switch (stage) + { + case IF_STAGE : pc_state->op = P_BUBBLE; break; + case ID_STAGE : if_id_state->op = P_BUBBLE; break; + case EX_STAGE : id_ex_state->op = P_BUBBLE; break; + case MEM_STAGE: ex_mem_state->op = P_BUBBLE; break; + case WB_STAGE : mem_wb_state->op = P_BUBBLE; break; + } +} + +/* stall stage (has effect at next update) */ +void sim_stall_stage(stage_id_t stage) { + switch (stage) + { + case IF_STAGE : pc_state->op = P_STALL; break; + case ID_STAGE : if_id_state->op = P_STALL; break; + case EX_STAGE : id_ex_state->op = P_STALL; break; + case MEM_STAGE: ex_mem_state->op = P_STALL; break; + case WB_STAGE : mem_wb_state->op = P_STALL; break; + } +} + + +static int initialized = 0; + +void sim_init() +{ + /* Create memory and register files */ + initialized = 1; + mem = init_mem(MEM_SIZE); + reg = init_reg(); + + /* create 5 pipe registers */ + pc_state = new_pipe(sizeof(pc_ele), (void *) &bubble_pc); + if_id_state = new_pipe(sizeof(if_id_ele), (void *) &bubble_if_id); + id_ex_state = new_pipe(sizeof(id_ex_ele), (void *) &bubble_id_ex); + ex_mem_state = new_pipe(sizeof(ex_mem_ele), (void *) &bubble_ex_mem); + mem_wb_state = new_pipe(sizeof(mem_wb_ele), (void *) &bubble_mem_wb); + + /* connect them to the pipeline stages */ + pc_next = pc_state->next; + pc_curr = pc_state->current; + + if_id_next = if_id_state->next; + if_id_curr = if_id_state->current; + + id_ex_next = id_ex_state->next; + id_ex_curr = id_ex_state->current; + + ex_mem_next = ex_mem_state->next; + ex_mem_curr = ex_mem_state->current; + + mem_wb_next = mem_wb_state->next; + mem_wb_curr = mem_wb_state->current; + + sim_reset(); + clear_mem(mem); +} + +void sim_reset() +{ + if (!initialized) + sim_init(); + clear_pipes(); + clear_mem(reg); + minAddr = 0; + memCnt = 0; + starting_up = 1; + cycles = instructions = 0; + cc = DEFAULT_CC; + status = STAT_AOK; + +#ifdef HAS_GUI + if (gui_mode) { + signal_register_clear(); + create_memory_display(); + } +#endif + + amux = bmux = MUX_NONE; + cc = cc_in = DEFAULT_CC; + wb_destE = REG_NONE; + wb_valE = 0; + wb_destM = REG_NONE; + wb_valM = 0; + mem_addr = 0; + mem_data = 0; + mem_write = FALSE; + sim_report(); +} + +/* Update state elements */ +/* May need to disable updating of memory & condition codes */ +static void update_state(bool_t update_mem, bool_t update_cc) +{ + /* Writeback(s): + If either register is REG_NONE, write will have no effect . + Order of two writes determines semantics of + popl %rsp. According to ISA, %rsp will get popped value + */ + + if (wb_destE != REG_NONE) { + sim_log("\tWriteback: Wrote 0x%llx to register %s\n", + wb_valE, reg_name(wb_destE)); + set_reg_val(reg, wb_destE, wb_valE); + } + if (wb_destM != REG_NONE) { + sim_log("\tWriteback: Wrote 0x%llx to register %s\n", + wb_valM, reg_name(wb_destM)); + set_reg_val(reg, wb_destM, wb_valM); + } + + /* Memory write */ + if (mem_write && !update_mem) { + sim_log("\tDisabled write of 0x%llx to address 0x%llx\n", mem_data, mem_addr); + } + if (update_mem && mem_write) { + if (!set_word_val(mem, mem_addr, mem_data)) { + sim_log("\tCouldn't write to address 0x%llx\n", mem_addr); + } else { + sim_log("\tWrote 0x%llx to address 0x%llx\n", mem_data, mem_addr); + +#ifdef HAS_GUI + if (gui_mode) { + if (mem_addr % 8 != 0) { + /* Just did a misaligned write. + Need to display both words */ + word_t align_addr = mem_addr & ~0x3; + word_t val; + get_word_val(mem, align_addr, &val); + set_memory(align_addr, val); + align_addr+=8; + get_word_val(mem, align_addr, &val); + set_memory(align_addr, val); + } else { + set_memory(mem_addr, mem_data); + } + } +#endif + + } + } + if (update_cc) + cc = cc_in; +} + +/* Text representation of status */ +void tty_report(word_t cyc) { + sim_log("\nCycle %lld. CC=%s, Stat=%s\n", cyc, cc_name(cc), stat_name(status)); + + sim_log("F: predPC = 0x%llx\n", pc_curr->pc); + + sim_log("D: instr = %s, rA = %s, rB = %s, valC = 0x%llx, valP = 0x%llx, Stat = %s\n", + iname(HPACK(if_id_curr->icode, if_id_curr->ifun)), + reg_name(if_id_curr->ra), reg_name(if_id_curr->rb), + if_id_curr->valc, if_id_curr->valp, + stat_name(if_id_curr->status)); + + sim_log("E: instr = %s, valC = 0x%llx, valA = 0x%llx, valB = 0x%llx\n srcA = %s, srcB = %s, dstE = %s, dstM = %s, Stat = %s\n", + iname(HPACK(id_ex_curr->icode, id_ex_curr->ifun)), + id_ex_curr->valc, id_ex_curr->vala, id_ex_curr->valb, + reg_name(id_ex_curr->srca), reg_name(id_ex_curr->srcb), + reg_name(id_ex_curr->deste), reg_name(id_ex_curr->destm), + stat_name(id_ex_curr->status)); + + sim_log("M: instr = %s, Cnd = %d, valE = 0x%llx, valA = 0x%llx\n dstE = %s, dstM = %s, Stat = %s\n", + iname(HPACK(ex_mem_curr->icode, ex_mem_curr->ifun)), + ex_mem_curr->takebranch, + ex_mem_curr->vale, ex_mem_curr->vala, + reg_name(ex_mem_curr->deste), reg_name(ex_mem_curr->destm), + stat_name(ex_mem_curr->status)); + + sim_log("W: instr = %s, valE = 0x%llx, valM = 0x%llx, dstE = %s, dstM = %s, Stat = %s\n", + iname(HPACK(mem_wb_curr->icode, mem_wb_curr->ifun)), + mem_wb_curr->vale, mem_wb_curr->valm, + reg_name(mem_wb_curr->deste), reg_name(mem_wb_curr->destm), + stat_name(mem_wb_curr->status)); +} + +/* Run pipeline for one cycle */ +/* Return status of processor */ +/* Max_instr indicates maximum number of instructions that + want to complete during this simulation run. */ +static byte_t sim_step_pipe(word_t max_instr, word_t ccount) +{ + byte_t wb_status = mem_wb_curr->status; + byte_t mem_status = mem_wb_next->status; + /* How many instructions are ahead of one in wb / ex? */ + int ahead_mem = (wb_status != STAT_BUB); + int ahead_ex = ahead_mem + (mem_status != STAT_BUB); + bool_t update_mem = ahead_mem < max_instr; + bool_t update_cc = ahead_ex < max_instr; + + /* Update program-visible state */ + update_state(update_mem, update_cc); + /* Update pipe registers */ + update_pipes(); + tty_report(ccount); + if (pc_state->op == P_ERROR) + pc_curr->status = STAT_PIP; + if (if_id_state->op == P_ERROR) + if_id_curr->status = STAT_PIP; + if (id_ex_state->op == P_ERROR) + id_ex_curr->status = STAT_PIP; + if (ex_mem_state->op == P_ERROR) + ex_mem_curr->status = STAT_PIP; + if (mem_wb_state->op == P_ERROR) + mem_wb_curr->status = STAT_PIP; + + /* Need to do decode after execute & memory stages, + and memory stage before execute, in order to propagate + forwarding values properly */ + do_if_stage(); + do_mem_stage(); + do_ex_stage(); + do_id_wb_stages(); + + do_stall_check(); +#if 0 + /* This doesn't seem necessary */ + if (id_ex_curr->status != STAT_AOK + && id_ex_curr->status != STAT_BUB) { + if_id_state->op = P_BUBBLE; + id_ex_state->op = P_BUBBLE; + } +#endif + + /* Performance monitoring */ + if (mem_wb_curr->status != STAT_BUB && mem_wb_curr->icode != I_POP2) { + starting_up = 0; + instructions++; + cycles++; + } else { + if (!starting_up) + cycles++; + } + + sim_report(); + return status; +} + +/* + Run pipeline until one of following occurs: + - An error status is encountered in WB. + - max_instr instructions have completed through WB + - max_cycle cycles have been simulated + + Return number of instructions executed. + if statusp nonnull, then will be set to status of final instruction + if ccp nonnull, then will be set to condition codes of final instruction +*/ +word_t sim_run_pipe(word_t max_instr, word_t max_cycle, byte_t *statusp, cc_t *ccp) +{ + word_t icount = 0; + word_t ccount = 0; + byte_t run_status = STAT_AOK; + while (icount < max_instr && ccount < max_cycle) { + run_status = sim_step_pipe(max_instr-icount, ccount); + if (run_status != STAT_BUB) + icount++; + if (run_status != STAT_AOK && run_status != STAT_BUB) + break; + ccount++; + } + if (statusp) + *statusp = run_status; + if (ccp) + *ccp = cc; + return icount; +} + +/* If dumpfile set nonNULL, lots of status info printed out */ +void sim_set_dumpfile(FILE *df) +{ + dumpfile = df; +} + +/* + * sim_log dumps a formatted string to the dumpfile, if it exists + * accepts variable argument list + */ +void sim_log( const char *format, ... ) { + if (dumpfile) { + va_list arg; + va_start( arg, format ); + vfprintf( dumpfile, format, arg ); + va_end( arg ); + } +} + + +/************************************************************* + * Part 3: This part contains support for the GUI simulator + *************************************************************/ + +#ifdef HAS_GUI + +/********************** + * Begin Part 3 globals + **********************/ + +/* Hack for SunOS */ +extern int matherr(); +int *tclDummyMathPtr = (int *) matherr; + +static char tcl_msg[256]; + +/* Keep track of the TCL Interpreter */ +static Tcl_Interp *sim_interp = NULL; + +static mem_t post_load_mem; + +/********************** + * End Part 3 globals + **********************/ + + +/****************************************************************************** + * function declarations + ******************************************************************************/ + +int simResetCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); + +int simLoadCodeCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); + +int simLoadDataCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); + +int simRunCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); + +int simModeCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); + +void addAppCommands(Tcl_Interp *interp); + + +/****************************************************************************** + * tcl command definitions + ******************************************************************************/ + +/* Implement command versions of the simulation functions */ +int simResetCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + sim_interp = interp; + if (argc != 1) { + interp->result = "No arguments allowed"; + return TCL_ERROR; + } + sim_reset(); + if (post_load_mem) { + free_mem(mem); + mem = copy_mem(post_load_mem); + } + interp->result = stat_name(STAT_AOK); + return TCL_OK; +} + +int simLoadCodeCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + FILE *code_file; + word_t code_count; + sim_interp = interp; + if (argc != 2) { + interp->result = "One argument required"; + return TCL_ERROR; + } + code_file = fopen(argv[1], "r"); + if (!code_file) { + sprintf(tcl_msg, "Couldn't open code file '%s'", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + sim_reset(); + code_count = load_mem(mem, code_file, 0); + post_load_mem = copy_mem(mem); + sprintf(tcl_msg, "%lld", code_count); + interp->result = tcl_msg; + fclose(code_file); + return TCL_OK; +} + +int simLoadDataCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + FILE *data_file; + word_t word_count = 0; + interp->result = "Not implemented"; + return TCL_ERROR; + + + sim_interp = interp; + if (argc != 2) { + interp->result = "One argument required"; + return TCL_ERROR; + } + data_file = fopen(argv[1], "r"); + if (!data_file) { + sprintf(tcl_msg, "Couldn't open data file '%s'", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + sprintf(tcl_msg, "%lld", word_count); + interp->result = tcl_msg; + fclose(data_file); + return TCL_OK; +} + + +int simRunCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + word_t cycle_limit = 1; + byte_t status; + cc_t cc; + sim_interp = interp; + if (argc > 2) { + interp->result = "At most one argument allowed"; + return TCL_ERROR; + } + if (argc >= 2 && + (sscanf(argv[1], "%lld", &cycle_limit) != 1 || + cycle_limit < 0)) { + sprintf(tcl_msg, "Cannot run for '%s' cycles!", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + sim_run_pipe(cycle_limit + 5, cycle_limit, &status, &cc); + interp->result = stat_name(status); + return TCL_OK; +} + +int simModeCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + sim_interp = interp; + if (argc != 2) { + interp->result = "One argument required"; + return TCL_ERROR; + } + interp->result = argv[1]; + if (strcmp(argv[1], "wedged") == 0) + sim_mode = S_WEDGED; + else if (strcmp(argv[1], "stall") == 0) + sim_mode = S_STALL; + else if (strcmp(argv[1], "forward") == 0) + sim_mode = S_FORWARD; + else { + sprintf(tcl_msg, "Unknown mode '%s'", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + return TCL_OK; +} + + +/****************************************************************************** + * registering the commands with tcl + ******************************************************************************/ + +void addAppCommands(Tcl_Interp *interp) +{ + sim_interp = interp; + Tcl_CreateCommand(interp, "simReset", (Tcl_CmdProc *) simResetCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "simCode", (Tcl_CmdProc *) simLoadCodeCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "simData", (Tcl_CmdProc *) simLoadDataCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "simRun", (Tcl_CmdProc *) simRunCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "setSimMode", (Tcl_CmdProc *) simModeCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); +} + +/****************************************************************************** + * tcl functionality called from within C + ******************************************************************************/ + +/* Provide mechanism for simulator to update register display */ +void signal_register_update(reg_id_t r, word_t val) { + int code; + sprintf(tcl_msg, "setReg %d %lld 1", (int) r, (word_t) val); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to signal register set\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to generate memory display */ +void create_memory_display() { + int code; + sprintf(tcl_msg, "createMem %lld %lld", minAddr, memCnt); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Command '%s' failed\n", tcl_msg); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } else { + word_t i; + for (i = 0; i < memCnt && code == TCL_OK; i+=8) { + word_t addr = minAddr+i; + word_t val; + if (!get_word_val(mem, addr, &val)) { + fprintf(stderr, "Out of bounds memory display\n"); + return; + } + sprintf(tcl_msg, "setMem %lld %lld", addr, val); + code = Tcl_Eval(sim_interp, tcl_msg); + } + if (code != TCL_OK) { + fprintf(stderr, "Couldn't set memory value\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } + } +} + +/* Provide mechanism for simulator to update memory value */ +void set_memory(word_t addr, word_t val) { + int code; + word_t nminAddr = minAddr; + word_t nmemCnt = memCnt; + + /* First see if we need to expand memory range */ + if (memCnt == 0) { + nminAddr = addr; + nmemCnt = 8; + } else if (addr < minAddr) { + nminAddr = addr; + nmemCnt = minAddr + memCnt - addr; + } else if (addr >= minAddr+memCnt) { + nmemCnt = addr-minAddr+8; + } + /* Now make sure nminAddr & nmemCnt are multiples of 16 */ + nmemCnt = ((nminAddr & 0xF) + nmemCnt + 0xF) & ~0xF; + nminAddr = nminAddr & ~0xF; + + if (nminAddr != minAddr || nmemCnt != memCnt) { + minAddr = nminAddr; + memCnt = nmemCnt; + create_memory_display(); + } else { + sprintf(tcl_msg, "setMem %lld %lld", addr, val); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Couldn't set memory value 0x%llx to 0x%llx\n", + addr, val); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } + } +} + +/* Provide mechanism for simulator to update condition code display */ +void show_cc(cc_t cc) +{ + int code; + sprintf(tcl_msg, "setCC %d %d %d", + GET_ZF(cc), GET_SF(cc), GET_OF(cc)); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to display condition codes\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to update status display */ +void show_stat(stat_t stat) +{ + int code; + sprintf(tcl_msg, "showStat %s", stat_name(stat)); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to display status\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + + + +/* Provide mechanism for simulator to update performance information */ +void show_cpi() { + int code; + double cpi = instructions > 0 ? (double) cycles/instructions : 1.0; + sprintf(tcl_msg, "showCPI %lld %lld %.2f", + cycles, instructions, (double) cpi); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to display CPI\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +char *rname[] = {"none", "ea", "eb", "me", "wm", "we"}; + +/* provide mechanism for simulator to specify source registers */ +void signal_sources() { + int code; + sprintf(tcl_msg, "showSources %s %s", + rname[amux], rname[bmux]); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to signal forwarding sources\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to clear register display */ +void signal_register_clear() { + int code; + code = Tcl_Eval(sim_interp, "clearReg"); + if (code != TCL_OK) { + fprintf(stderr, "Failed to signal register clear\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to report instructions as they are + read in +*/ + +void report_line(word_t line_no, word_t addr, char *hex, char *text) { + int code; + sprintf(tcl_msg, "addCodeLine %lld %lld {%s} {%s}", line_no, addr, hex, text); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to report code line 0x%llx\n", addr); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + + +/* Provide mechanism for simulator to report which instructions are in + which stages */ +void report_pc(unsigned fpc, unsigned char fpcv, + unsigned dpc, unsigned char dpcv, + unsigned epc, unsigned char epcv, + unsigned mpc, unsigned char mpcv, + unsigned wpc, unsigned char wpcv) +{ + int status; + char addr[10]; + char code[12]; + Tcl_DString cmd; + Tcl_DStringInit(&cmd); + Tcl_DStringAppend(&cmd, "simLabel ", -1); + Tcl_DStringStartSublist(&cmd); + if (fpcv) { + sprintf(addr, "%u", fpc); + Tcl_DStringAppendElement(&cmd, addr); + } + if (dpcv) { + sprintf(addr, "%u", dpc); + Tcl_DStringAppendElement(&cmd, addr); + } + if (epcv) { + sprintf(addr, "%u", epc); + Tcl_DStringAppendElement(&cmd, addr); + } + if (mpcv) { + sprintf(addr, "%u", mpc); + Tcl_DStringAppendElement(&cmd, addr); + } + if (wpcv) { + sprintf(addr, "%u", wpc); + Tcl_DStringAppendElement(&cmd, addr); + } + Tcl_DStringEndSublist(&cmd); + Tcl_DStringStartSublist(&cmd); + sprintf(code, "%s %s %s %s %s", + fpcv ? "F" : "", + dpcv ? "D" : "", + epcv ? "E" : "", + mpcv ? "M" : "", + wpcv ? "W" : ""); + Tcl_DStringAppend(&cmd, code, -1); + Tcl_DStringEndSublist(&cmd); + /* Debug + fprintf(stderr, "Code '%s'\n", Tcl_DStringValue(&cmd)); + */ + status = Tcl_Eval(sim_interp, Tcl_DStringValue(&cmd)); + if (status != TCL_OK) { + fprintf(stderr, "Failed to report pipe code '%s'\n", code); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Report single line of pipeline state */ +void report_state(char *id, word_t current, char *txt) +{ + int status; + sprintf(tcl_msg, "updateStage %s %lld {%s}", id, current,txt); + status = Tcl_Eval(sim_interp, tcl_msg); + if (status != TCL_OK) { + fprintf(stderr, "Failed to report pipe status\n"); + fprintf(stderr, "\tStage %s.%s, status '%s'\n", + id, current ? "current" : "next", txt); + fprintf(stderr, "\tError Message was '%s'\n", sim_interp->result); + } +} + + +/* + * Tcl_AppInit - Called by TCL to perform application-specific initialization. + */ +int Tcl_AppInit(Tcl_Interp *interp) +{ + /* Tell TCL about the name of the simulator so it can */ + /* use it as the title of the main window */ + Tcl_SetVar(interp, "simname", simname, TCL_GLOBAL_ONLY); + + if (Tcl_Init(interp) == TCL_ERROR) + return TCL_ERROR; + if (Tk_Init(interp) == TCL_ERROR) + return TCL_ERROR; + Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); + + /* Call procedure to add new commands */ + addAppCommands(interp); + + /* + * Specify a user-specific startup file to invoke if the application + * is run interactively. Typically the startup file is "~/.apprc" + * where "app" is the name of the application. If this line is deleted + * then no user-specific startup file will be run under any conditions. + */ + Tcl_SetVar(interp, "tcl_rcFileName", "~/.wishrc", TCL_GLOBAL_ONLY); + return TCL_OK; + +} + +#endif /* HAS_GUI */ + + +/************************************************************** + * Part 4: Code for implementing pipelined processor simulators + *************************************************************/ + +/****************************************************************************** + * defines + ******************************************************************************/ + +#define MAX_STAGE 10 + +/****************************************************************************** + * static variables + ******************************************************************************/ + +static pipe_ptr pipes[MAX_STAGE]; +static int pipe_count = 0; + +/****************************************************************************** + * function definitions + ******************************************************************************/ + +/* Create new pipe with count bytes of state */ +/* bubble_val indicates state corresponding to pipeline bubble */ +pipe_ptr new_pipe(int count, void *bubble_val) +{ + pipe_ptr result = (pipe_ptr) malloc(sizeof(pipe_ele)); + result->current = malloc(count); + result->next = malloc(count); + memcpy(result->current, bubble_val, count); + memcpy(result->next, bubble_val, count); + result->count = count; + result->op = P_LOAD; + result->bubble_val = bubble_val; + pipes[pipe_count++] = result; + return result; +} + +/* Update all pipes */ +void update_pipes() +{ + int s; + for (s = 0; s < pipe_count; s++) { + pipe_ptr p = pipes[s]; + switch (p->op) + { + case P_BUBBLE: + /* insert a bubble into the next stage */ + memcpy(p->current, p->bubble_val, p->count); + break; + + case P_LOAD: + /* copy calculated state from previous stage */ + memcpy(p->current, p->next, p->count); + break; + case P_ERROR: + /* Like a bubble, but insert error condition */ + memcpy(p->current, p->bubble_val, p->count); + break; + case P_STALL: + default: + /* do nothing: next stage gets same instr again */ + ; + } + if (p->op != P_ERROR) + p->op = P_LOAD; + } +} + +/* Set all pipes to bubble values */ +void clear_pipes() +{ + int s; + for (s = 0; s < pipe_count; s++) { + pipe_ptr p = pipes[s]; + memcpy(p->current, p->bubble_val, p->count); + memcpy(p->next, p->bubble_val, p->count); + p->op = P_LOAD; + } +} + +/******************** Utility Code *************************/ + +/* Representations of digits */ +static char digits[16] = + {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + +/* Print hex/oct/binary format with leading zeros */ +/* bpd denotes bits per digit Should be in range 1-4, + pbw denotes bits per word.*/ +void wprint(uword_t x, int bpd, int bpw, FILE *fp) +{ + int digit; + uword_t mask = ((uword_t) 1 << bpd) - 1; + for (digit = (bpw-1)/bpd; digit >= 0; digit--) { + uword_t val = (x >> (digit * bpd)) & mask; + putc(digits[val], fp); + } +} + +/* Create string in hex/oct/binary format with leading zeros */ +/* bpd denotes bits per digit Should be in range 1-4, + pbw denotes bits per word.*/ +void wstring(uword_t x, int bpd, int bpw, char *str) +{ + int digit; + uword_t mask = ((uword_t) 1 << bpd) - 1; + for (digit = (bpw-1)/bpd; digit >= 0; digit--) { + uword_t val = (x >> (digit * bpd)) & mask; + *str++ = digits[val]; + } + *str = '\0'; +} + + +/******************************** + * Part 5: Stage implementations + *********************************/ + +/*************** Bubbled version of stages *************/ + +pc_ele bubble_pc = {0,STAT_AOK}; +if_id_ele bubble_if_id = { I_NOP, 0, REG_NONE,REG_NONE, + 0, 0, STAT_BUB, 0}; +id_ex_ele bubble_id_ex = { I_NOP, 0, 0, 0, 0, + REG_NONE, REG_NONE, REG_NONE, REG_NONE, + STAT_BUB, 0}; + +ex_mem_ele bubble_ex_mem = { I_NOP, 0, FALSE, 0, 0, + REG_NONE, REG_NONE, STAT_BUB, 0}; + +mem_wb_ele bubble_mem_wb = { I_NOP, 0, 0, 0, REG_NONE, REG_NONE, + STAT_BUB, 0}; + +/*************** Stage Implementations *****************/ + +word_t gen_f_pc(); +word_t gen_need_regids(); +word_t gen_need_valC(); +word_t gen_instr_valid(); +word_t gen_f_predPC(); +word_t gen_f_icode(); +word_t gen_f_ifun(); +word_t gen_f_stat(); +word_t gen_instr_valid(); + +void do_if_stage() +{ + byte_t instr = HPACK(I_NOP, F_NONE); + byte_t regids = HPACK(REG_NONE, REG_NONE); + word_t valc = 0; + word_t valp = f_pc = gen_f_pc(); + + /* Ready to fetch instruction. Speculatively fetch register byte + and immediate word + */ + imem_error = !get_byte_val(mem, valp, &instr); + imem_icode = HI4(instr); + imem_ifun = LO4(instr); + if (!imem_error) { + byte_t junk; + /* Make sure can read maximum length instruction */ + imem_error = !get_byte_val(mem, valp+5, &junk); + } + if_id_next->icode = gen_f_icode(); + if_id_next->ifun = gen_f_ifun(); + if (!imem_error) { + sim_log("\tFetch: f_pc = 0x%llx, imem_instr = %s, f_instr = %s\n", + f_pc, iname(instr), + iname(HPACK(if_id_next->icode, if_id_next->ifun))); + } + + instr_valid = gen_instr_valid(); + if (!instr_valid) + sim_log("\tFetch: Instruction code 0x%llx invalid\n", instr); + if_id_next->status = gen_f_stat(); + + valp++; + if (gen_need_regids()) { + get_byte_val(mem, valp, ®ids); + valp ++; + } + if_id_next->ra = HI4(regids); + if_id_next->rb = LO4(regids); + if (gen_need_valC()) { + get_word_val(mem, valp, &valc); + valp+= 8; + } + if_id_next->valp = valp; + if_id_next->valc = valc; + + pc_next->pc = gen_f_predPC(); + + pc_next->status = (if_id_next->status == STAT_AOK) ? STAT_AOK : STAT_BUB; + + if_id_next->stage_pc = f_pc; +} + +word_t gen_d_srcA(); +word_t gen_d_srcB(); +word_t gen_d_dstE(); +word_t gen_d_dstM(); +word_t gen_d_valA(); +word_t gen_d_valB(); +word_t gen_w_dstE(); +word_t gen_w_valE(); +word_t gen_w_dstM(); +word_t gen_w_valM(); +word_t gen_Stat(); + +/* Implements both ID and WB */ +void do_id_wb_stages() +{ + /* Set up write backs. Don't occur until end of cycle */ + wb_destE = gen_w_dstE(); + wb_valE = gen_w_valE(); + wb_destM = gen_w_dstM(); + wb_valM = gen_w_valM(); + + /* Update processor status */ + status = gen_Stat(); + + id_ex_next->srca = gen_d_srcA(); + id_ex_next->srcb = gen_d_srcB(); + id_ex_next->deste = gen_d_dstE(); + id_ex_next->destm = gen_d_dstM(); + + /* Read the registers */ + d_regvala = get_reg_val(reg, id_ex_next->srca); + d_regvalb = get_reg_val(reg, id_ex_next->srcb); + + /* Do forwarding and valA selection */ + id_ex_next->vala = gen_d_valA(); + id_ex_next->valb = gen_d_valB(); + + id_ex_next->icode = if_id_curr->icode; + id_ex_next->ifun = if_id_curr->ifun; + id_ex_next->valc = if_id_curr->valc; + id_ex_next->stage_pc = if_id_curr->stage_pc; + id_ex_next->status = if_id_curr->status; +} + +word_t gen_alufun(); +word_t gen_set_cc(); +word_t gen_Bch(); +word_t gen_aluA(); +word_t gen_aluB(); +word_t gen_e_valA(); +word_t gen_e_dstE(); + +void do_ex_stage() +{ + alu_t alufun = gen_alufun(); + bool_t setcc = gen_set_cc(); + word_t alua, alub; + + alua = gen_aluA(); + alub = gen_aluB(); + + e_bcond = cond_holds(cc, id_ex_curr->ifun); + + ex_mem_next->takebranch = e_bcond; + + if (id_ex_curr->icode == I_JMP) + sim_log("\tExecute: instr = %s, cc = %s, branch %staken\n", + iname(HPACK(id_ex_curr->icode, id_ex_curr->ifun)), + cc_name(cc), + ex_mem_next->takebranch ? "" : "not "); + + /* Perform the ALU operation */ + word_t aluout = compute_alu(alufun, alua, alub); + ex_mem_next->vale = aluout; + sim_log("\tExecute: ALU: %c 0x%llx 0x%llx --> 0x%llx\n", + op_name(alufun), alua, alub, aluout); + + if (setcc) { + cc_in = compute_cc(alufun, alua, alub); + sim_log("\tExecute: New cc = %s\n", cc_name(cc_in)); + } + + ex_mem_next->icode = id_ex_curr->icode; + ex_mem_next->ifun = id_ex_curr->ifun; + ex_mem_next->vala = gen_e_valA(); + ex_mem_next->deste = gen_e_dstE(); + ex_mem_next->destm = id_ex_curr->destm; + ex_mem_next->srca = id_ex_curr->srca; + ex_mem_next->status = id_ex_curr->status; + ex_mem_next->stage_pc = id_ex_curr->stage_pc; +} + +/* Functions defined using HCL */ +word_t gen_mem_addr(); +word_t gen_mem_read(); +word_t gen_mem_write(); +word_t gen_m_stat(); + +void do_mem_stage() +{ + bool_t read = gen_mem_read(); + + word_t valm = 0; + + mem_addr = gen_mem_addr(); + mem_data = ex_mem_curr->vala; + mem_write = gen_mem_write(); + dmem_error = FALSE; + + if (read) { + dmem_error = dmem_error || !get_word_val(mem, mem_addr, &valm); + if (!dmem_error) + sim_log("\tMemory: Read 0x%llx from 0x%llx\n", + valm, mem_addr); + } + if (mem_write) { + word_t sink; + /* Do a read of address just to check validity */ + dmem_error = dmem_error || !get_word_val(mem, mem_addr, &sink); + if (dmem_error) + sim_log("\tMemory: Invalid address 0x%llx\n", + mem_addr); + } + mem_wb_next->icode = ex_mem_curr->icode; + mem_wb_next->ifun = ex_mem_curr->ifun; + mem_wb_next->vale = ex_mem_curr->vale; + mem_wb_next->valm = valm; + mem_wb_next->deste = ex_mem_curr->deste; + mem_wb_next->destm = ex_mem_curr->destm; + mem_wb_next->status = gen_m_stat(); + mem_wb_next->stage_pc = ex_mem_curr->stage_pc; +} + +/* Set stalling conditions for different stages */ + +word_t gen_F_stall(), gen_F_bubble(); +word_t gen_D_stall(), gen_D_bubble(); +word_t gen_E_stall(), gen_E_bubble(); +word_t gen_M_stall(), gen_M_bubble(); +word_t gen_W_stall(), gen_W_bubble(); + +p_stat_t pipe_cntl(char *name, word_t stall, word_t bubble) +{ + if (stall) { + if (bubble) { + sim_log("%s: Conflicting control signals for pipe register\n", + name); + return P_ERROR; + } else + return P_STALL; + } else { + return bubble ? P_BUBBLE : P_LOAD; + } +} + +void do_stall_check() +{ + pc_state->op = pipe_cntl("PC", gen_F_stall(), gen_F_bubble()); + if_id_state->op = pipe_cntl("ID", gen_D_stall(), gen_D_bubble()); + id_ex_state->op = pipe_cntl("EX", gen_E_stall(), gen_E_bubble()); + ex_mem_state->op = pipe_cntl("MEM", gen_M_stall(), gen_M_bubble()); + mem_wb_state->op = pipe_cntl("WB", gen_W_stall(), gen_W_bubble()); +} + + + diff --git a/arch/sim/pipe/sdriver.ys b/arch/sim/pipe/sdriver.ys new file mode 100644 index 0000000..929bc2c --- /dev/null +++ b/arch/sim/pipe/sdriver.ys @@ -0,0 +1,145 @@ +####################################################################### +# Test for copying block of size 4; +####################################################################### + .pos 0 +main: irmovq Stack, %rsp # Set up stack pointer + + # Set up arguments for copy function and then invoke it + irmovq $4, %rdx # src and dst have 4 elements + irmovq dest, %rsi # dst array + irmovq src, %rdi # src array + call ncopy + halt # should halt with num nonzeros in %rax +StartFun: +#/* $begin ncopy-ys */ +################################################################## +# ncopy.ys - Copy a src block of len words to dst. +# Return the number of positive words (>0) contained in src. +# +# Include your name and ID here. +# +# Describe how and why you modified the baseline code. +# +################################################################## +# Do not modify this portion +# Function prologue. +# %rdi = src, %rsi = dst, %rdx = len +ncopy: + +################################################################## +# You can modify this portion + # Loop header + xorq %rax,%rax # count = 0; + iaddq $0xfffffffffffffffc, %rdx + jle Tail # if so, goto Done: + +Loop1: + mrmovq (%rdi), %r10 # read val from src... + rmmovq %r10, (%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos1 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos1: + + mrmovq 8(%rdi), %r10 # read val from src... + rmmovq %r10, 8(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos2 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos2: + + mrmovq 16(%rdi), %r10 # read val from src... + rmmovq %r10, 16(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos3 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos3: + + mrmovq 24(%rdi), %r10 # read val from src... + rmmovq %r10, 24(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos4 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos4: + + mrmovq 32(%rdi), %r10 # read val from src... + rmmovq %r10, 32(%rsi) # ...and store it to dst + andq %r10, %r10 # val <= 0? + jle Npos5 # if so, goto Npos: + iaddq $1, %rax # count++ +Npos5: + + iaddq $40, %rdi # src++ + iaddq $40, %rsi # dst++ + iaddq $0xfffffffffffffffb, %rdx # len-- + jg Loop1 + +Tail: + iaddq $4, %rdx + jle Done +Loop2: + mrmovq (%rdi), %r10 + rmmovq %r10, (%rsi) + andq %r10, %r10 + jle NposT + iaddq $1, %rax +NposT: + iaddq $8, %rdi + iaddq $8, %rsi + iaddq $0xffffffffffffffff, %rdx + jg Loop2 + + +################################################################## +# Do not modify the following section of code +# Function epilogue. +Done: + ret +################################################################## +# Keep the following label at the end of your function +End: +#/* $end ncopy-ys */ +EndFun: + +############################### +# Source and destination blocks +############################### + .align 8 +src: + .quad 1 + .quad -2 + .quad 3 + .quad -4 + .quad 0xbcdefa # This shouldn't get moved + + .align 16 +Predest: + .quad 0xbcdefa +dest: + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab + .quad 0xcdefab +Postdest: + .quad 0xdefabc + +.align 8 +# Run time stack + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .quad 0 + +Stack: diff --git a/arch/sim/pipe/sim.h b/arch/sim/pipe/sim.h new file mode 100644 index 0000000..b176318 --- /dev/null +++ b/arch/sim/pipe/sim.h @@ -0,0 +1,153 @@ + +/********** Typedefs ************/ + +/* EX stage mux settings */ +typedef enum { MUX_NONE, MUX_EX_A, MUX_EX_B, MUX_MEM_E, + MUX_WB_M, MUX_WB_E } mux_source_t; + +/* Simulator operating modes */ +typedef enum { S_WEDGED, S_STALL, S_FORWARD } sim_mode_t; + +/* Pipeline stage identifiers for stage operation control */ +typedef enum { IF_STAGE, ID_STAGE, EX_STAGE, MEM_STAGE, WB_STAGE } stage_id_t; + +/********** Defines **************/ + +/* Get ra out of one byte regid field */ +#define GET_RA(r) HI4(r) + +/* Get rb out of one byte regid field */ +#define GET_RB(r) LO4(r) + + +/************ Global state declaration ****************/ + +/* How many cycles have been simulated? */ +extern word_t cycles; +/* How many instructions have passed through the EX stage? */ +extern word_t instructions; + +/* Both instruction and data memory */ +extern mem_t mem; + +/* Keep track of range of addresses that have been written */ +extern word_t minAddr; +extern word_t memCnt; + +/* Register file */ +extern mem_t reg; +/* Condition code register */ +extern cc_t cc; +extern stat_t stat; + +/* Operand sources in EX (to show forwarding) */ +extern mux_source_t amux, bmux; + +/* Provide global access to current states of all pipeline registers */ +pipe_ptr pc_state, if_id_state, id_ex_state, ex_mem_state, mem_wb_state; + +/* Current States */ +extern pc_ptr pc_curr; +extern if_id_ptr if_id_curr; +extern id_ex_ptr id_ex_curr; +extern ex_mem_ptr ex_mem_curr; +extern mem_wb_ptr mem_wb_curr; + +/* Next States */ +extern pc_ptr pc_next; +extern if_id_ptr if_id_next; +extern id_ex_ptr id_ex_next; +extern ex_mem_ptr ex_mem_next; +extern mem_wb_ptr mem_wb_next; + +/* Pending updates to state */ +extern word_t cc_in; +extern word_t wb_destE; +extern word_t wb_valE; +extern word_t wb_destM; +extern word_t wb_valM; +extern word_t mem_addr; +extern word_t mem_data; +extern bool_t mem_write; + + +/* Intermdiate stage values that must be used by control functions */ +extern word_t f_pc; +extern byte_t imem_icode; +extern byte_t imem_ifun; +extern bool_t imem_error; +extern bool_t instr_valid; +extern word_t d_regvala; +extern word_t d_regvalb; +extern word_t e_vala; +extern word_t e_valb; +extern bool_t e_bcond; +extern bool_t dmem_error; + +/* Simulator operating mode */ +extern sim_mode_t sim_mode; +/* Log file */ +extern FILE *dumpfile; + +/*************** Simulation Control Functions ***********/ + +/* Bubble next execution of specified stage */ +void sim_bubble_stage(stage_id_t stage); + +/* Stall stage (has effect at next update) */ +void sim_stall_stage(stage_id_t stage); + +/* Sets the simulator name (called from main routine in HCL file) */ +void set_simname(char *name); + +/* Initialize simulator */ +void sim_init(); + +/* Reset simulator state, including register, instruction, and data memories */ +void sim_reset(); + +/* + Run pipeline until one of following occurs: + - A status error is encountered in WB. + - max_instr instructions have completed through WB + - max_cycle cycles have been simulated + + Return number of instructions executed. + if statusp nonnull, then will be set to status of final instruction + if ccp nonnull, then will be set to condition codes of final instruction +*/ +word_t sim_run_pipe(word_t max_instr, word_t max_cycle, byte_t *statusp, cc_t *ccp); + +/* If dumpfile set nonNULL, lots of status info printed out */ +void sim_set_dumpfile(FILE *file); + +/* + * sim_log dumps a formatted string to the dumpfile, if it exists + * accepts variable argument list + */ +void sim_log( const char *format, ... ); + + +/******************* GUI Interface Functions **********************/ +#ifdef HAS_GUI + +void signal_sources(); + +void signal_register_clear(); + +void report_pc(unsigned fpc, unsigned char fpcv, + unsigned dpc, unsigned char dpcv, + unsigned epc, unsigned char epcv, + unsigned mpc, unsigned char mpcv, + unsigned wpc, unsigned char wpcv); + +void report_state(char *id, word_t current, char *txt); + +void show_cc(cc_t cc); +void show_cpi(); +void show_stat(stat_t stat); + +void create_memory_display(); +void set_memory(word_t addr, word_t val); +#endif + diff --git a/arch/sim/pipe/stages.h b/arch/sim/pipe/stages.h new file mode 100644 index 0000000..a86db9a --- /dev/null +++ b/arch/sim/pipe/stages.h @@ -0,0 +1,90 @@ +/* + * stages.h - Defines the layout of the pipe registers + * Declares the functions that implement the pipeline stages +*/ + +/********** Pipeline register contents **************/ + +/* Program Counter */ +typedef struct { + word_t pc; + stat_t status; +} pc_ele, *pc_ptr; + +/* IF/ID Pipe Register */ +typedef struct { + byte_t icode; /* Single byte instruction code */ + byte_t ifun; /* ALU/JMP qualifier */ + byte_t ra; /* Register ra ID */ + byte_t rb; /* Register rb ID */ + word_t valc; /* Instruction word encoding immediate data */ + word_t valp; /* Incremented program counter */ + stat_t status; + /* The following is included for debugging */ + word_t stage_pc; +} if_id_ele, *if_id_ptr; + +/* ID/EX Pipe Register */ +typedef struct { + byte_t icode; /* Instruction code */ + byte_t ifun; /* ALU/JMP qualifier */ + word_t valc; /* Immediate data */ + word_t vala; /* valA */ + word_t valb; /* valB */ + byte_t srca; /* Source Reg ID for valA */ + byte_t srcb; /* Source Reg ID for valB */ + byte_t deste; /* Destination register for valE */ + byte_t destm; /* Destination register for valM */ + stat_t status; + /* The following is included for debugging */ + word_t stage_pc; +} id_ex_ele, *id_ex_ptr; + +/* EX/MEM Pipe Register */ +typedef struct { + byte_t icode; /* Instruction code */ + byte_t ifun; /* ALU/JMP qualifier */ + bool_t takebranch; /* Taken branch signal */ + word_t vale; /* valE */ + word_t vala; /* valA */ + byte_t deste; /* Destination register for valE */ + byte_t destm; /* Destination register for valM */ + byte_t srca; /* Source register for valA */ + stat_t status; + /* The following is included for debugging */ + word_t stage_pc; +} ex_mem_ele, *ex_mem_ptr; + +/* Mem/WB Pipe Register */ +typedef struct { + byte_t icode; /* Instruction code */ + byte_t ifun; /* ALU/JMP qualifier */ + word_t vale; /* valE */ + word_t valm; /* valM */ + byte_t deste; /* Destination register for valE */ + byte_t destm; /* Destination register for valM */ + stat_t status; + /* The following is included for debugging */ + word_t stage_pc; +} mem_wb_ele, *mem_wb_ptr; + +/************ Global Declarations ********************/ + +extern pc_ele bubble_pc; +extern if_id_ele bubble_if_id; +extern id_ex_ele bubble_id_ex; +extern ex_mem_ele bubble_ex_mem; +extern mem_wb_ele bubble_mem_wb; + +/************ Function declarations *******************/ + +/* Stage functions */ +void do_if_stage(); +void do_id_wb_stages(); /* Both ID and WB */ +void do_ex_stage(); +void do_mem_stage(); + +/* Set stalling conditions for different stages */ +void do_stall_check(); + + diff --git a/arch/sim/ptest/Makefile b/arch/sim/ptest/Makefile new file mode 100644 index 0000000..bc356e2 --- /dev/null +++ b/arch/sim/ptest/Makefile @@ -0,0 +1,20 @@ +SIM=../pipe/psim +TFLAGS= + +ISADIR = ../misc +YAS=$(ISADIR)/yas + +.SUFFIXES: .ys .yo + +.ys.yo: + $(YAS) $*.ys + +test: + ./optest.pl -s $(SIM) $(TFLAGS) + ./jtest.pl -s $(SIM) $(TFLAGS) + ./ctest.pl -s $(SIM) $(TFLAGS) + ./htest.pl -s $(SIM) $(TFLAGS) + +clean: + rm -f *.o *~ *.yo *.ys + diff --git a/arch/sim/ptest/README b/arch/sim/ptest/README new file mode 100644 index 0000000..7ea9625 --- /dev/null +++ b/arch/sim/ptest/README @@ -0,0 +1,36 @@ +This directory contains Perl scripts that provide comprehensive +regression testing of the different Y86-64 simulators. There are four +basic test types, implemented as four different scripts: + + optest.pl: Tests each individual instruction type + jtest.pl: Tests all of the jump types under different conditions + ctest.pl: Tests different pipeline control combinations + htest.pl: Tests many different hazard possibilities + This involves running 864+ tests, so it takes a while. + +Each of the tests has the following optional arguments: + -s simfile Use simfile as simulator (default ../pipe/psim). + -i Test the iaddq instruction + +You can use make to run all four test programs. Options to make include: + + SIM=simfile + TFLAGS= + +For example, you could say: + make SIM=../pipe/psim TFLAGS=-i +to test the pipeline simulator including the iaddq instruction. (Note that +this test will fail for the default implementation of pipe, since it does +not implement the iaddq instruction.) + +When the test program detects an erroneous simulation, it leaves the +.ys file in the directory (ordinarily it deletes the test code it +generates). You can then run a simulator (the GUI version is +especially helpful here) on one of these failing cases. Suppose the +failing test is in file bad-test.ys. Then you can execute "make +bad-test.yo" to create the object code, and simulate it with one of +the simulators. + +Note that the standard test code only detects functional bugs, where the +processor simulation produces different results than would be +predicted by simulating at the ISA level. diff --git a/arch/sim/ptest/ctest.pl b/arch/sim/ptest/ctest.pl new file mode 100755 index 0000000..1788aee --- /dev/null +++ b/arch/sim/ptest/ctest.pl @@ -0,0 +1,113 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl +# Test for pipeline hazard combinations + +use Getopt::Std; +use lib "."; +use tester; + +cmdline(); + +# Instruction templates +$tcount = 8; + +@templates = +( + "||jne target\n\thalt\ntarget:|", # M + "|||ret", # R + + "||mrmovq (%rax),%rsp|ret", # G1a + "|mrmovq (%rax),%rsp||ret", # G1b + "mrmovq (%rax),%rsp|||ret", # G1c + "||irmovq \$3,%rax|rrmovq %rax,%rdx", # G2a + "|irmovq \$3,%rax||rrmovq %rax,%rdx", # G2b + "irmovq \$3,%rax|||rrmovq %rax,%rdx", # G2c +); + +# Try combining two templates to generate test sequence +sub make_test +{ + local ($t1, $t2) = @_; + $ok = 1; + @test1 = split(/\|/, $t1); + @test2 = split(/\|/, $t2); + for ($i = 0; $i < 4; $i++) { + if ($test1[$i] eq "") { + if ($test2[$i] eq "") { + $test[$i] = "nop"; + } else { + $test[$i] = $test2[$i]; + } + } else { + if ($test2[$i] eq "") { + $test[$i] = $test1[$i]; + } else { + if ($test1[$i] eq $test2[$i]) { +# $ok = 0; + $test[$i] = $test1[$i]; + } else { + $ok = 0; + $test[$i] = "XXX"; + } + } + } + } + if ($ok) { + &gen_test($test[0], $test[1], $test[2], $test[3]); + } + +} + +$testcnt = 0; + +# Generate test with 4 instructions inserted +sub gen_test +{ + local ($i1, $i2, $i3, $i4) = @_; + $tname = "c-$testcnt"; + $testcnt++; + open(YFILE, ">$tname.ys") || die "Can't write to $tname.ys\n"; + + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + &gen_test($e, "nop", $s); + close YFILE; + &run_test($tname); + + # Two instructions in succession + $tname = "e-$ei-$si"; + open (YFILE, ">$tname.ys") || die "Can't write to $tname.ys\n"; + &gen_test($e, "", $s); + close YFILE; + &run_test($tname); + $si++; + } + $si = 0; + $ei++; +} + +&test_stat(); diff --git a/arch/sim/ptest/htest.pl b/arch/sim/ptest/htest.pl new file mode 100755 index 0000000..210f940 --- /dev/null +++ b/arch/sim/ptest/htest.pl @@ -0,0 +1,249 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl +# Test for pipeline hazards + +use Getopt::Std; +use lib "."; +use tester; + +cmdline(); + +# Destination Instructions +@dest = +( + # Having %rax as destination + "1:rrmovq %rcx,%rax", + "1:irmovq \$0x101,%rax", + "1:mrmovq 0(%rbp),%rax", + "1:addq %rax,%rax", + "1:popq %rax", + "1:cmovne %rcx,%rax", # Not taken + "1:cmove %rcx,%rax", # Taken + # Instructions having %rbp as destination + "2:rrmovq %rax,%rbp", + "2:irmovq \$0x100,%rbp", + "2:mrmovq 4(%rbp),%rbp", + "2:addq %rax,%rbp", + "2:popq %rbp", + "2:cmovne %rax,%rbp", # Not taken + "2:cmove %rax,%rbp", # Taken + # Instructions having %rsp as destination + "3:rrmovq %rbp,%rsp", + "3:irmovq \$0x104,%rsp", + "3:mrmovq 4(%rbp),%rsp", + "3:addq %rax,%rsp", + "3:popq %rbp", + "3:pushq %rax", + "3:pushq %rsp", + "3:popq %rsp", + "1:cmovne %rbp,%rsp", # Not taken + "1:cmove %rbp,%rsp" # Taken + ); + +if ($testiaddq) { + @dest = (@dest, + "1:iaddq \$0x201,%rax", + "2:iaddq \$0x4,%rbp", + "3:iaddq \$0x4,%rsp",); +} + +if ($testleave) { + @dest = (@dest, "2:leave", "3:leave"); +} + +@src = +( + # Instructions having %rax as source + "1:rrmovq %rax,%rbp", + "1:rmmovq %rax,0(%rbp)", + "1:rmmovq %rbp,0(%rax)", + "1:mrmovq 4(%rax),%rbp", + "1:addq %rax,%rbp", + "1:addq %rbp,%rax", + "1:addq %rax,%rax", + "1:pushq %rax", + # Instructions having %rbp as source + "2:rrmovq %rbp,%rbp", + "2:rmmovq %rbp,4(%rbp)", + "2:rmmovq %rax,0(%rbp)", + "2:mrmovq 8(%rbp),%rax", + "2:addq %rbp,%rax", + "2:addq %rax,%rbp", + "2:addq %rbp,%rbp", + "2:pushq %rbp", + # Instructions having %rsp as source + "3:rrmovq %rsp,%rbp", + "3:rmmovq %rsp,4(%rbp)", + "3:rmmovq %rax,-4(%rsp)", + "3:mrmovq 4(%rsp),%rax", + "3:addq %rsp,%rax", + "3:addq %rax,%rsp", + "3:addq %rsp,%rsp", + "3:pushq %rsp", + "3:ret" + ); + +if ($testiaddq) { + @src = (@src, + "1:iaddq \$0x301,%rax", + "2:iaddq \$0x8,%rbp", + "3:iaddq \$0x8,%rsp"); +} + +# Generate test with 4 instructions inserted +sub gen_test +{ + local ($i1, $i2, $i3, $i4) = @_; + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + &gen_test($d, "nop", "nop", $s); + close YFILE; + &run_test($tname); + + # Two instructions with nop between them + $tname = "hn-$di-$si"; + open (YFILE, ">$tname.ys") || die "Can't write to $tname.ys\n"; + &gen_test($d, "nop", "", $s); + close YFILE; + &run_test($tname); + + # Two instructions in succession + $tname = "h-$di-$si"; + open (YFILE, ">$tname.ys") || die "Can't write to $tname.ys\n"; + &gen_test($d, "", "", $s); + close YFILE; + &run_test($tname); + } + $si++; + } + $si = 0; + $di++; +} + +&test_stat(); diff --git a/arch/sim/ptest/jtest.pl b/arch/sim/ptest/jtest.pl new file mode 100755 index 0000000..5d60b5f --- /dev/null +++ b/arch/sim/ptest/jtest.pl @@ -0,0 +1,127 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl +# Test jump instructions + +use Getopt::Std; +use lib "."; +use tester; + +cmdline(); + +@vals = (32, 64); + +@instr = ("jmp", "jle", "jl", "je", "jne", "jge", "jg", "call"); + +# Create set of forward tests +foreach $t (@instr) { + foreach $va (@vals) { + foreach $vb (@vals) { + $tname = "jf-$t-$va-$vb"; + open (YFILE, ">$tname.ys") || die "Can't write to $tname.ys\n"; + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + print YFILE <$tname.ys") || die "Can't write to $tname.ys\n"; + print YFILE <] [-P] [-p ]\n"; + print STDERR " -h print Help message\n"; + print STDERR " -i test iaddq instruction\n"; + print STDERR " -s Specify simulator\n"; + print STDERR " -d Specify directory for counterexamples\n"; + print STDERR " -P Generate performance data\n"; + print STDERR " -p Check using performance file \n"; + print STDERR " -V test Verilog implementation\n"; + print STDERR " -m Model for Verilog\n"; + die "\n"; + } + + if ($opt_i) { + $testiaddq = 1; + } + + if ($opt_d) { + $outputdir = $opt_d; + } + + if ($opt_P) { + $gen_perf = 1; + } + + if ($opt_p) { + $check_perf = 1; + $perf_file = $opt_p; + } + + if ($opt_s) { + $sim = $opt_s; + } + if ($opt_V) { + $test_vlog = 1; + if ($opt_m) { + $vmodel = $opt_m; + } + } else { + print "Simulating with $sim\n"; + } +} + +# Perl gives error messages without the following line !?! +$junk = 1; + + + + + diff --git a/arch/sim/seq/Makefile b/arch/sim/seq/Makefile new file mode 100644 index 0000000..0c71aae --- /dev/null +++ b/arch/sim/seq/Makefile @@ -0,0 +1,65 @@ +# Modify this line to indicate the default version + +VERSION=std + +# Comment this out if you don't have Tcl/Tk on your system + +GUIMODE=-DHAS_GUI + +# Modify the following line so that gcc can find the libtcl.so and +# libtk.so libraries on your system. You may need to use the -L option +# to tell gcc which directory to look in. Comment this out if you +# don't have Tcl/Tk. + +TKLIBS=-L/usr/lib -ltk -ltcl + +# Modify the following line so that gcc can find the tcl.h and tk.h +# header files on your system. Comment this out if you don't have +# Tcl/Tk. + +TKINC=-isystem /usr/include/tcl8.5 + +# Modify these two lines to choose your compiler and compile time +# flags. + +CC=gcc +CFLAGS=-Wall -O2 + +################################################## +# You shouldn't need to modify anything below here +################################################## + +MISCDIR=../misc +HCL2C=$(MISCDIR)/hcl2c +INC=$(TKINC) -I$(MISCDIR) $(GUIMODE) +LIBS=$(TKLIBS) -lm +YAS=../misc/yas + +all: ssim + +# This rule builds the SEQ simulator (ssim) +ssim: seq-$(VERSION).hcl ssim.c sim.h $(MISCDIR)/isa.c $(MISCDIR)/isa.h + # Building the seq-$(VERSION).hcl version of SEQ + $(HCL2C) -n seq-$(VERSION).hcl seq-$(VERSION).c + $(CC) $(CFLAGS) $(INC) -o ssim \ + seq-$(VERSION).c ssim.c $(MISCDIR)/isa.c $(LIBS) + +# This rule builds the SEQ+ simulator (ssim+) +ssim+: seq+-std.hcl ssim.c sim.h $(MISCDIR)/isa.c $(MISCDIR)/isa.h + # Building the seq+-std.hcl version of SEQ+ + $(HCL2C) -n seq+-std.hcl seq+-std.c + $(CC) $(CFLAGS) $(INC) -o ssim+ \ + seq+-std.c ssim.c $(MISCDIR)/isa.c $(LIBS) + +# These are implicit rules for assembling .yo files from .ys files. +.SUFFIXES: .ys .yo +.ys.yo: + $(YAS) $*.ys + + +clean: + rm -f ssim ssim+ seq*-*.c *.o *~ *.exe *.yo *.ys + + + + diff --git a/arch/sim/seq/README b/arch/sim/seq/README new file mode 100644 index 0000000..2a3157f --- /dev/null +++ b/arch/sim/seq/README @@ -0,0 +1,91 @@ +/*********************************************************************** + * Sequential Y86-64 Simulators + * + * Copyright (c) 2002, 2010, 2013, 2015 R. Bryant and D. O'Hallaron, + * All rights reserved. + * May not be used, modified, or copied without permission. + ***********************************************************************/ + +This directory contains the code to construct simulators for SEQ, +SEQ+, and the variants of it described in the homework exercises. + +************************** +1. Building the simulators +************************** + +Different versions of the SEQ and SEQ+ simulators can be constructed +to use different HCL files when working on the different homework +problems. + +Binary VERSION HCL File Description +ssim std seq-std.hcl Standard SEQ simulator described in textbook. +ssim full seq-full.hcl For adding iaddq to SEQ. +ssim+ std seq+-std.hcl Standard SEQ+ simulator described in textbook. + +The simulators run in either TTY or GUI mode: + +o TTY mode: A simulator running in TTY mode prints all information +about its runtime behavior on the terminal. It's hard to understand what's +going on, but useful for automated testing, and doesn't require any +special installation features. + +o GUI mode: A simulator running in GUI mode uses a fancy graphical +user interface. Nice for visualizing and debugging, but requires +installation of Tcl/Tk on your system. + +The Makefile has simple instructions for building TTY or GUI +simulators. A TTY simulator runs in TTY mode only. A GUI +simulator can run in either TTY mode or GUI mode, according to +a command line argument. + +Once you've configured the Makefile, you can build the different +simulators with commands of the form + + unix> make clean; make ssim VERSION=xxx + +where "xxx" is one of the versions listed above. For example, to build +the version of SEQ described in the CS:APP text based on the control +logic in seq-std.hcl, type + + unix> make clean; make ssim VERSION=std + +To save typing, you can also set the Makefile's VERSION variable. + +*********************** +2. Using the simulators +*********************** + +The simulators take identical command line arguments: + +Usage: ssim [-htg] [-l m] [-v n] file.yo + +file.yo required in GUI mode, optional in TTY mode (default stdin) + + -h Print this message + -g Run in GUI mode instead of TTY mode (default TTY mode) + -l m Set instruction limit to m [TTY mode only] (default 10000) + -v n Set verbosity level to 0 <= n <= 2 [TTY mode only] (default 2) + -t Test result against the ISA simulator (yis) [TTY model only] + +******** +3. Files +******** + +Makefile Builds the SEQ and SEQ+ simulators +Makefile-sim Makefile for student distribution +README This file + +seq+.tcl TCL script for GUI version of SEQ+ +seq.tcl TCL script for GUI version of SEQ + +ssim.c Base sequential simulator code and header file +sim.h + +seq-std.hcl Standard SEQ control logic +seq+-std.hcl Standard SEQ+ control logic +seq-full.hcl Template for the iaddq problem (4.34-35) + +seq-full-ans.hcl Solution for the iaddq problems (4.34-35) + (Instructor distribution only) + + diff --git a/arch/sim/seq/description.md b/arch/sim/seq/description.md new file mode 100644 index 0000000..c42d1b3 --- /dev/null +++ b/arch/sim/seq/description.md @@ -0,0 +1,11 @@ +|阶段|iaddq V,rB| +|:---|:---| +|取指|icode:ifun<-M1[PC]| +||rA:rB<-M1[PC+1]| +||valC<-M8[PC+2]| +||valP<-PC+10| +|译码|valB<-R[rB]| +|执行|valE<-valB+valC| +|访存|| +|写回|R[rB]<-valE| +|更新 PC|PC<-valP| diff --git a/arch/sim/seq/seq+-std.hcl b/arch/sim/seq/seq+-std.hcl new file mode 100644 index 0000000..a045832 --- /dev/null +++ b/arch/sim/seq/seq+-std.hcl @@ -0,0 +1,226 @@ +#/* $begin seq-all-hcl */ +#################################################################### +# HCL Description of Control for Single Cycle Y86-64 Processor SEQ+ # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2010 # +#################################################################### + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'word_t gen_new_pc(){return 0;}' +quote 'int main(int argc, char *argv[])' +quote ' {plusmode=1;return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced explicitly ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ##### +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic #################### + +##### PC stage inputs ##### + +## All of these values are based on those from previous instruction +wordsig pIcode 'prev_icode' # Instr. control code +wordsig pValC 'prev_valc' # Constant from instruction +wordsig pValM 'prev_valm' # Value read from memory +wordsig pValP 'prev_valp' # Incremented program counter +boolsig pCnd 'prev_bcond' # Condition flag + +##### Fetch stage computations ##### +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig icode 'icode' # Instruction control code +wordsig ifun 'ifun' # Instruction function +wordsig rA 'ra' # rA field from instruction +wordsig rB 'rb' # rB field from instruction +wordsig valC 'valc' # Constant from instruction +wordsig valP 'valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Decode stage computations ##### +wordsig valA 'vala' # Value from register A port +wordsig valB 'valb' # Value from register B port + +##### Execute stage computations ##### +wordsig valE 'vale' # Value computed by ALU +boolsig Cnd 'cond' # Branch test + +##### Memory stage computations ##### +wordsig valM 'valm' # Value read from memory +boolsig dmem_error 'dmem_error' # Error signal from data memory + + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Program Counter Computation ####################### + +# Compute fetch location for this instruction based on results from +# previous instruction. + +word pc = [ + # Call. Use instruction constant + pIcode == ICALL : pValC; + # Taken branch. Use instruction constant + pIcode == IJXX && pCnd : pValC; + # Completion of RET instruction. Use value from stack + pIcode == IRET : pValM; + # Default: Use incremented PC + 1 : pValP; +]; +#/* $end seq-plus-pc-hcl */ + +################ Fetch Stage ################################### + +# Determine instruction code +word icode = [ + imem_error: INOP; + 1: imem_icode; # Default: get from instruction memory +]; + +# Determine instruction function +word ifun = [ + imem_error: FNONE; + 1: imem_ifun; # Default: get from instruction memory +]; + +bool instr_valid = icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Does fetched instruction require a regid byte? +bool need_regids = + icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +################ Decode Stage ################################### + +## What register should be used as the A source? +word srcA = [ + icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA; + icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word srcB = [ + icode in { IOPQ, IRMMOVQ, IMRMOVQ } : rB; + icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word dstE = [ + icode in { IRRMOVQ } && Cnd : rB; + icode in { IIRMOVQ, IOPQ} : rB; + icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word dstM = [ + icode in { IMRMOVQ, IPOPQ } : rA; + 1 : RNONE; # Don't write any register +]; + +################ Execute Stage ################################### + +## Select input A to ALU +word aluA = [ + icode in { IRRMOVQ, IOPQ } : valA; + icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC; + icode in { ICALL, IPUSHQ } : -8; + icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : valB; + icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + icode == IOPQ : ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = icode in { IOPQ }; + +################ Memory Stage ################################### + +## Set read control signal +bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL }; + +## Select memory address +word mem_addr = [ + icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE; + icode in { IPOPQ, IRET } : valA; + # Other instructions don't need address +]; + +## Select memory input data +word mem_data = [ + # Value from register + icode in { IRMMOVQ, IPUSHQ } : valA; + # Return PC + icode == ICALL : valP; + # Default: Don't write anything +]; + +## Determine instruction status +word Stat = [ + imem_error || dmem_error : SADR; + !instr_valid: SINS; + icode == IHALT : SHLT; + 1 : SAOK; +]; +#/* $end seq-all-hcl */ diff --git a/arch/sim/seq/seq+.tcl b/arch/sim/seq/seq+.tcl new file mode 100644 index 0000000..73b0627 --- /dev/null +++ b/arch/sim/seq/seq+.tcl @@ -0,0 +1,540 @@ +########################################################################## +# Parsing of command line flags # +########################################################################## + +proc flagVal {flag default} { + global argv + foreach t $argv { + if {[string match "-$flag*" $t]} {return [string range $t 2 end]} + } + return $default +} + +proc findFlag {flag} { + global argv + foreach t $argv { + if {[string match "-$flag" $t]} {return 1} + } + return 0 +} + +########################################################################## +# Register File Implementation. Shown as array of 8 columns # +########################################################################## + + +# Font used to display register contents +set fontSize [expr 10 * [flagVal "f" 12]] +set codeFontSize [expr 10 * [flagVal "c" 10]] +set labFontSize [expr 10 * [flagVal "l" 10]] +set bigFontSize [expr 10 * [flagVal "b" 16]] +set dpyFont "*-courier-medium-r-normal--*-$fontSize-*-*-*-*-*-*" +set labFont "*-helvetica-medium-r-normal--*-$labFontSize-*-*-*-*-*-*" +set bigLabFont "*-helvetica-bold-r-normal--*-$bigFontSize-*-*-*-*-*-*" +set codeFont "*-courier-medium-r-normal--*-$codeFontSize-*-*-*-*-*-*" +# Background Color of normal register +set normalBg white +# Background Color of highlighted register +set specialBg LightSkyBlue + +# Height of titles separating major sections of control panel +set sectionHeight 2 + + +# How many rows of code do I display +set codeRowCount [flagVal "r" 50] + +# Keep track of previous highlighted register +set lastId -1 +proc setReg {id val highlight} { + global lastId normalBg specialBg + if {$lastId >= 0} { + .r.reg$lastId config -bg $normalBg + set lastId -1 + } + if {$id < 0 || $id >= 15} { + error "Invalid Register ($id)" + } + .r.reg$id config -text [format %16x $val] + if {$highlight} { + uplevel .r.reg$id config -bg $specialBg + set lastId $id + } +} + +# Clear all registers +proc clearReg {} { + global lastId normalBg + if {$lastId >= 0} { + .r.reg$lastId config -bg $normalBg + set lastId -1 + } + for {set i 0} {$i < 8} {incr i 1} { + .r.reg$i config -text "" + } +} + +# Set all 3 condition codes +proc setCC {zv cv ov} { + .cc.cc0 config -text [format %d $zv] + .cc.cc1 config -text [format %d $cv] + .cc.cc2 config -text [format %d $ov] +} + + +### Create display for misc. state +frame .flags +pack .flags -in . -side bottom + +############################################################################## +# Status Display # +############################################################################## + +set simStat "AOK" +# Line to display simulation status +frame .stat +pack .stat -in .flags -side left +label .stat.statlab -width 7 -text "Stat" -height $sectionHeight -font $bigLabFont +label .stat.statdpy -width 3 -font $dpyFont -relief ridge -bg white -textvariable simStat +label .stat.fill -width 6 -text "" +pack .stat.statlab .stat.statdpy .stat.fill -in .stat -side left +############################################################################## +# Condition Code Display # +############################################################################## +# Create Window for condition codes +frame .cc +pack .cc -in .flags -side right + +label .cc.lab -text "Condition Codes" -height $sectionHeight -font $bigLabFont +pack .cc.lab -in .cc -side left + + +set ccnames [list "Z" "S" "O"] + +# Create Row of CC Labels +for {set i 0} {$i < 3} {incr i 1} { + label .cc.lab$i -width 1 -font $dpyFont -text [lindex $ccnames $i] + pack .cc.lab$i -in .cc -side left + label .cc.cc$i -width 1 -font $dpyFont -relief ridge -bg $normalBg + pack .cc.cc$i -in .cc -side left +} + +############################################################################## +# Register Display # +############################################################################## + + +# Create Window for registers +frame .r +pack .r -in . -side bottom +# Following give separate window for register file +# toplevel .r +# wm title .r "Register File" -height $sectionHeight -font $bigLabFont +label .r.lab -text "Register File" -font $bigLabFont -height $sectionHeight +pack .r.lab -in .r -side top +# Set up top row control panel (disabled) +# frame .r.cntl +# pack .r.cntl -fill x -in .r +# label .r.labreg -text "Register" -width 10 +# entry .r.regid -width 3 -relief sunken -textvariable regId -font $dpyFont +# label .r.labval -text "Value" -width 10 +# entry .r.regval -width 8 -relief sunken -textvariable regVal -font $dpyFont +# button .r.doset -text "Set" -command {setReg $regId $regVal 1} -width 6 +# button .r.c -text "Clear" -command clearReg -width 6 +# pack .r.labreg .r.regid .r.labval .r.regval .r.doset .r.c -in .r.cntl -side left + +set regnames [list "%rax" "%rcx" "%rdx" "%rbx" "%rsp" "%rbp" "%rsi" "%rdi" "%r8 " "%r9 " "%r10" "%r11" "%r12" "%r13" "%r14" ""] + +# Create rows of register labels and displays +for {set j 0} {$j < 3} {incr j 1} { + frame .r.labels$j + pack .r.labels$j -side top -in .r + + for {set c 0} {$c < 5} {incr c 1} { + set i [expr $j * 5 + $c] + label .r.lab$i -width 16 -font $dpyFont -text [lindex $regnames $i] + pack .r.lab$i -in .r.labels$j -side left + } + + # Create Row of Register Entries + frame .r.row$j + pack .r.row$j -side top -in .r + + # Create 5 registers + for {set c 0} {$c < 5} {incr c 1} { + set i [expr $j * 5 + $c] + if {$i == 15} { + label .r.reg$i -width 16 -font $dpyFont -text "" + } else { + label .r.reg$i -width 16 -font $dpyFont -relief ridge \ + -bg $normalBg + } + pack .r.reg$i -in .r.row$j -side left + } + +} + +############################################################################## +# Main Control Panel # +############################################################################## +# +# Set the simulator name (defined in simname in ssim.c) +# as the title of the main window +# +wm title . $simname +#wm title . "Y86-64 Simulator" + +# Control Panel for simulator +set cntlBW 11 +frame .cntl +pack .cntl +button .cntl.quit -width $cntlBW -text Quit -command exit +button .cntl.run -width $cntlBW -text Go -command simGo +button .cntl.stop -width $cntlBW -text Stop -command simStop +button .cntl.step -width $cntlBW -text Step -command simStep +button .cntl.reset -width $cntlBW -text Reset -command simResetAll +pack .cntl.quit .cntl.run .cntl.stop .cntl.step .cntl.reset -in .cntl -side left +# Simulation speed control +scale .spd -label {Simulator Speed (10*log Hz)} -from -10 -to 30 -length 10c \ + -orient horizontal -command setSpeed +pack .spd + +# Simulation mode +set simMode forward + +# frame .md +# pack .md +# radiobutton .md.wedged -text Wedged -variable simMode \ +# -value wedged -width 10 -command {setSimMode wedged} +# radiobutton .md.stall -text Stall -variable simMode \ +# -value stall -width 10 -command {setSimMode stall} +# radiobutton .md.forward -text Forward -variable simMode \ +# -value forward -width 10 -command {setSimMode forward} +# pack .md.wedged .md.stall .md.forward -in .md -side left + +# simDelay defines #milliseconds for each cycle of simulator +# Initial value is 1000ms +set simDelay 1000 +# Set delay based on rate expressed in log(Hz) +proc setSpeed {rate} { + global simDelay + set simDelay [expr round(1000 / pow(10,$rate/10.0))] +} + +# Global variables controlling simulator execution +# Should simulator be running now? +set simGoOK 0 + +proc simStop {} { + global simGoOK + set simGoOK 0 +} + +proc simStep {} { + global simStat + set simStat [simRun 1] +} + +proc simGo {} { + global simGoOK simDelay simStat + set simGoOK 1 + # Disable the Go and Step buttons + # Enable the Stop button + while {$simGoOK} { + # run the simulator 1 cycle + after $simDelay + set simStat [simRun 1] + if {$simStat != "AOK" && $simStat != "BUB"} {set simGoOK 0} + update + } + # Disable the Stop button + # Enable the Go and Step buttons +} + +############################################################################## +# Processor State display # +############################################################################## + +# Overall width of pipe register display +set procWidth 60 +set procHeight 1 +set labWidth 8 + +# Add labeled display to window +proc addDisp {win width name} { + global dpyFont labFont + set lname [string tolower $name] + frame $win.$lname + pack $win.$lname -in $win -side left + label $win.$lname.t -text $name -font $labFont + label $win.$lname.c -width $width -font $dpyFont -bg white -relief ridge + pack $win.$lname.t $win.$lname.c -in $win.$lname -side top + return [list $win.$lname.c] +} + +# Set text in display row +proc setDisp {wins txts} { + for {set i 0} {$i < [llength $wins] && $i < [llength $txts]} {incr i} { + set win [lindex $wins $i] + set txt [lindex $txts $i] + $win config -text $txt + } +} + +frame .p -width $procWidth +pack .p -in . -side bottom +label .p.lab -text "Processor State" -height $sectionHeight -font $bigLabFont +pack .p.lab -in .p -side top +label .p.mem -text "Memory Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.ex -text "Execute Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.id -text "Decode Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.if -text "Fetch Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.pcc -text "PC Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +# Mem +frame .p.m +# Execute +frame .p.e +# Decode +frame .p.d +# Fetch +frame .p.f +# PC +frame .p.pc +# Prev +frame .p.prev +pack .p.m .p.mem .p.e .p.ex .p.d .p.id .p.f .p.if .p.pc .p.pcc .p.prev -in .p -side top -anchor w -expand 1 + +# Take list of lists, and transpose nesting +# Assumes all lists are of same length +proc ltranspose {inlist} { + set result {} + for {set i 0} {$i < [llength [lindex $inlist 0]]} {incr i} { + set nlist {} + for {set j 0} {$j < [llength $inlist]} {incr j} { + set ele [lindex [lindex $inlist $j] $i] + set nlist [concat $nlist [list $ele]] + } + set result [concat $result [list $nlist]] + } + return $result +} + +# Fields in PREV display +# Total size = 57 +set pwins(PREV) [ltranspose \ + [list [addDisp .p.prev 3 pCnd] \ + [addDisp .p.prev 6 pInstr] \ + [addDisp .p.prev 16 pValC] \ + [addDisp .p.prev 16 pValM] \ + [addDisp .p.prev 16 pValP]]] + + +# Fields in PC display +# Total size = 16 +set pwins(PC) [ltranspose [list [addDisp .p.pc 16 PC]]] + +# Fetch display +# Total size = 6+4+4+16+16 = 46 +set pwins(F) [ltranspose \ + [list [addDisp .p.f 6 Instr] \ + [addDisp .p.f 4 rA]\ + [addDisp .p.f 4 rB] \ + [addDisp .p.f 16 valC] \ + [addDisp .p.f 16 valP]]] + +# Decode Display +# Total size = 16+16+4+4+4+4 = 48 +set pwins(D) [ltranspose \ + [list [addDisp .p.d 16 valA] \ + [addDisp .p.d 16 valB] \ + [addDisp .p.d 4 dstE] \ + [addDisp .p.d 4 dstM] \ + [addDisp .p.d 4 srcA] \ + [addDisp .p.d 4 srcB]]] + +# Execute Display +# Total size = 3+16 = 19 +set pwins(E) [ltranspose \ + [list [addDisp .p.e 3 Cnd] \ + [addDisp .p.e 16 valE]]] + +# Memory Display +# Total size = 16 +set pwins(M) [ltranspose \ + [list [addDisp .p.m 16 valM]]] + +# update status line for specified proc register +proc updateStage {name txts} { + set Name [string toupper $name] + global pwins + set wins [lindex $pwins($Name) 0] + setDisp $wins $txts +} + +########################################################################## +# Instruction Display # +########################################################################## + +toplevel .c +wm title .c "Program Code" +frame .c.cntl +pack .c.cntl -in .c -side top -anchor w +label .c.filelab -width 10 -text "File" +entry .c.filename -width 20 -relief sunken -textvariable codeFile \ + -font $dpyFont -bg white +button .c.loadbutton -width $cntlBW -command {loadCode $codeFile} -text Load +pack .c.filelab .c.filename .c.loadbutton -in .c.cntl -side left + +proc clearCode {} { + simLabel {} {} + destroy .c.t + destroy .c.tr +} + +proc createCode {} { + # Create Code Structure + frame .c.t + pack .c.t -in .c -side top -anchor w + frame .c.tr + pack .c.tr -in .c.t -side top -anchor nw +} + +proc loadCode {file} { + # Kill old code window + clearCode + # Create new one + createCode + simCode $file + simResetAll +} + +# Start with initial code window, even though it will be destroyed. +createCode + +# Add a line of code to the display +proc addCodeLine {line addr op text} { + global codeRowCount + # Create new line in display + global codeFont + frame .c.tr.$addr + pack .c.tr.$addr -in .c.tr -side top -anchor w + label .c.tr.$addr.a -width 6 -text [format "0x%x" $addr] -font $codeFont + label .c.tr.$addr.i -width 20 -text $op -font $codeFont + label .c.tr.$addr.s -width 2 -text "" -font $codeFont -bg white + label .c.tr.$addr.t -text $text -font $codeFont + pack .c.tr.$addr.a .c.tr.$addr.i .c.tr.$addr.s \ + .c.tr.$addr.t -in .c.tr.$addr -side left +} + +# Keep track of which instructions have stage labels + +set oldAddr {} + +proc simLabel {addrs labs} { + global oldAddr + set newAddr {} + # Clear away any old labels + foreach a $oldAddr { + .c.tr.$a.s config -text "" + } + for {set i 0} {$i < [llength $addrs]} {incr i} { + set a [lindex $addrs $i] + set t [lindex $labs $i] + if {[winfo exists .c.tr.$a]} { + .c.tr.$a.s config -text $t + set newAddr [concat $newAddr $a] + } + } + set oldAddr $newAddr +} + +proc simResetAll {} { + global simStat + set simStat "AOK" + simReset + simLabel {} {} + clearMem +} + +############################################################################### +# Memory Display # +############################################################################### +toplevel .m +wm title .m "Memory Contents" +frame .m.t +pack .m.t -in .m -side top -anchor w + +label .m.t.lab -width 6 -font $dpyFont -text " " +pack .m.t.lab -in .m.t -side left +for {set i 0} {$i < 16} {incr i 8} { + label .m.t.a$i -width 16 -font $dpyFont -text [format " 0x---%x" [expr $i % 16]] + pack .m.t.a$i -in .m.t -side left +} + + +# Keep track of range of addresses currently displayed +set minAddr 0 +set memCnt 0 +set haveMem 0 + +proc createMem {nminAddr nmemCnt} { + global minAddr memCnt haveMem codeFont dpyFont normalBg + set minAddr $nminAddr + set memCnt $nmemCnt + + if { $haveMem } { destroy .m.e } + + # Create Memory Structure + frame .m.e + set haveMem 1 + pack .m.e -in .m -side top -anchor w + # Now fill it with values + for {set i 0} {$i < $memCnt} {incr i 16} { + set addr [expr $minAddr + $i] + + frame .m.e.r$i + pack .m.e.r$i -side bottom -in .m.e + label .m.e.r$i.lab -width 6 -font $dpyFont -text [format "0x%.3x-" [expr $addr / 16]] + pack .m.e.r$i.lab -in .m.e.r$i -side left + + for {set j 0} {$j < 16} {incr j 8} { + set a [expr $addr + $j] + label .m.e.v$a -width 16 -font $dpyFont -relief ridge \ + -bg $normalBg + pack .m.e.v$a -in .m.e.r$i -side left + } + } +} + +proc setMem {Addr Val} { + global minAddr memCnt + if {$Addr < $minAddr || $Addr > [expr $minAddr + $memCnt]} { + error "Memory address $Addr out of range" + } + .m.e.v$Addr config -text [format %16x $Val] +} + +proc clearMem {} { + destroy .m.e + createMem 0 0 +} + + + +############################################################################### +# Command Line Initialization # +############################################################################### + +# Get code file name from input + +# Find file with specified extension +proc findFile {tlist ext} { + foreach t $tlist { + if {[string match "*.$ext" $t]} {return $t} + } + return "" +} + + +set codeFile [findFile $argv yo] +if {$codeFile != ""} { loadCode $codeFile} diff --git a/arch/sim/seq/seq-full.hcl b/arch/sim/seq/seq-full.hcl new file mode 100644 index 0000000..4f592b1 --- /dev/null +++ b/arch/sim/seq/seq-full.hcl @@ -0,0 +1,224 @@ +#/* $begin seq-all-hcl */ +#################################################################### +# HCL Description of Control for Single Cycle Y86-64 Processor SEQ # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2010 # +#################################################################### + +## Your task is to implement the iaddq instruction +## The file contains a declaration of the icodes +## for iaddq (IIADDQ) +## Your job is to add the rest of the logic to make it work + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'word_t gen_pc(){return 0;}' +quote 'int main(int argc, char *argv[])' +quote ' {plusmode=0;return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' +# Instruction code for iaddq instruction +wordsig IIADDQ 'I_IADDQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced explicitly ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ##### +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic #################### + +##### Fetch stage inputs ##### +wordsig pc 'pc' # Program counter +##### Fetch stage computations ##### +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig icode 'icode' # Instruction control code +wordsig ifun 'ifun' # Instruction function +wordsig rA 'ra' # rA field from instruction +wordsig rB 'rb' # rB field from instruction +wordsig valC 'valc' # Constant from instruction +wordsig valP 'valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Decode stage computations ##### +wordsig valA 'vala' # Value from register A port +wordsig valB 'valb' # Value from register B port + +##### Execute stage computations ##### +wordsig valE 'vale' # Value computed by ALU +boolsig Cnd 'cond' # Branch test + +##### Memory stage computations ##### +wordsig valM 'valm' # Value read from memory +boolsig dmem_error 'dmem_error' # Error signal from data memory + + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +# Determine instruction code +word icode = [ + imem_error: INOP; + 1: imem_icode; # Default: get from instruction memory +]; + +# Determine instruction function +word ifun = [ + imem_error: FNONE; + 1: imem_ifun; # Default: get from instruction memory +]; + +bool instr_valid = icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ, IIADDQ }; + +# Does fetched instruction require a regid byte? +bool need_regids = + icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL, IIADDQ }; + +################ Decode Stage ################################### + +## What register should be used as the A source? +word srcA = [ + icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA; + icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word srcB = [ + icode in { IOPQ, IRMMOVQ, IMRMOVQ, IIADDQ } : rB; + icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word dstE = [ + icode in { IRRMOVQ } && Cnd : rB; + icode in { IIRMOVQ, IOPQ, IIADDQ } : rB; + icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word dstM = [ + icode in { IMRMOVQ, IPOPQ } : rA; + 1 : RNONE; # Don't write any register +]; + +################ Execute Stage ################################### + +## Select input A to ALU +word aluA = [ + icode in { IRRMOVQ, IOPQ } : valA; + icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ } : valC; + icode in { ICALL, IPUSHQ } : -8; + icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ, IIADDQ } : valB; + icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + icode == IOPQ : ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = icode in { IOPQ, IIADDQ }; + +################ Memory Stage ################################### + +## Set read control signal +bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL }; + +## Select memory address +word mem_addr = [ + icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE; + icode in { IPOPQ, IRET } : valA; + # Other instructions don't need address +]; + +## Select memory input data +word mem_data = [ + # Value from register + icode in { IRMMOVQ, IPUSHQ } : valA; + # Return PC + icode == ICALL : valP; + # Default: Don't write anything +]; + +## Determine instruction status +word Stat = [ + imem_error || dmem_error : SADR; + !instr_valid: SINS; + icode == IHALT : SHLT; + 1 : SAOK; +]; + +################ Program Counter Update ############################ + +## What address should instruction be fetched at + +word new_pc = [ + # Call. Use instruction constant + icode == ICALL : valC; + # Taken branch. Use instruction constant + icode == IJXX && Cnd : valC; + # Completion of RET instruction. Use value from stack + icode == IRET : valM; + # Default: Use incremented PC + 1 : valP; +]; +#/* $end seq-all-hcl */ diff --git a/arch/sim/seq/seq-std.hcl b/arch/sim/seq/seq-std.hcl new file mode 100644 index 0000000..9ee68ad --- /dev/null +++ b/arch/sim/seq/seq-std.hcl @@ -0,0 +1,217 @@ +#/* $begin seq-all-hcl */ +#################################################################### +# HCL Description of Control for Single Cycle Y86-64 Processor SEQ # +# Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2010 # +#################################################################### + +#################################################################### +# C Include's. Don't alter these # +#################################################################### + +quote '#include ' +quote '#include "isa.h"' +quote '#include "sim.h"' +quote 'int sim_main(int argc, char *argv[]);' +quote 'word_t gen_pc(){return 0;}' +quote 'int main(int argc, char *argv[])' +quote ' {plusmode=0;return sim_main(argc,argv);}' + +#################################################################### +# Declarations. Do not change/remove/delete any of these # +#################################################################### + +##### Symbolic representation of Y86-64 Instruction Codes ############# +wordsig INOP 'I_NOP' +wordsig IHALT 'I_HALT' +wordsig IRRMOVQ 'I_RRMOVQ' +wordsig IIRMOVQ 'I_IRMOVQ' +wordsig IRMMOVQ 'I_RMMOVQ' +wordsig IMRMOVQ 'I_MRMOVQ' +wordsig IOPQ 'I_ALU' +wordsig IJXX 'I_JMP' +wordsig ICALL 'I_CALL' +wordsig IRET 'I_RET' +wordsig IPUSHQ 'I_PUSHQ' +wordsig IPOPQ 'I_POPQ' + +##### Symbolic represenations of Y86-64 function codes ##### +wordsig FNONE 'F_NONE' # Default function code + +##### Symbolic representation of Y86-64 Registers referenced explicitly ##### +wordsig RRSP 'REG_RSP' # Stack Pointer +wordsig RNONE 'REG_NONE' # Special value indicating "no register" + +##### ALU Functions referenced explicitly ##### +wordsig ALUADD 'A_ADD' # ALU should add its arguments + +##### Possible instruction status values ##### +wordsig SAOK 'STAT_AOK' # Normal execution +wordsig SADR 'STAT_ADR' # Invalid memory address +wordsig SINS 'STAT_INS' # Invalid instruction +wordsig SHLT 'STAT_HLT' # Halt instruction encountered + +##### Signals that can be referenced by control logic #################### + +##### Fetch stage inputs ##### +wordsig pc 'pc' # Program counter +##### Fetch stage computations ##### +wordsig imem_icode 'imem_icode' # icode field from instruction memory +wordsig imem_ifun 'imem_ifun' # ifun field from instruction memory +wordsig icode 'icode' # Instruction control code +wordsig ifun 'ifun' # Instruction function +wordsig rA 'ra' # rA field from instruction +wordsig rB 'rb' # rB field from instruction +wordsig valC 'valc' # Constant from instruction +wordsig valP 'valp' # Address of following instruction +boolsig imem_error 'imem_error' # Error signal from instruction memory +boolsig instr_valid 'instr_valid' # Is fetched instruction valid? + +##### Decode stage computations ##### +wordsig valA 'vala' # Value from register A port +wordsig valB 'valb' # Value from register B port + +##### Execute stage computations ##### +wordsig valE 'vale' # Value computed by ALU +boolsig Cnd 'cond' # Branch test + +##### Memory stage computations ##### +wordsig valM 'valm' # Value read from memory +boolsig dmem_error 'dmem_error' # Error signal from data memory + + +#################################################################### +# Control Signal Definitions. # +#################################################################### + +################ Fetch Stage ################################### + +# Determine instruction code +word icode = [ + imem_error: INOP; + 1: imem_icode; # Default: get from instruction memory +]; + +# Determine instruction function +word ifun = [ + imem_error: FNONE; + 1: imem_ifun; # Default: get from instruction memory +]; + +bool instr_valid = icode in + { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, + IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ }; + +# Does fetched instruction require a regid byte? +bool need_regids = + icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, + IIRMOVQ, IRMMOVQ, IMRMOVQ }; + +# Does fetched instruction require a constant word? +bool need_valC = + icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL }; + +################ Decode Stage ################################### + +## What register should be used as the A source? +word srcA = [ + icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA; + icode in { IPOPQ, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the B source? +word srcB = [ + icode in { IOPQ, IRMMOVQ, IMRMOVQ } : rB; + icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't need register +]; + +## What register should be used as the E destination? +word dstE = [ + icode in { IRRMOVQ } && Cnd : rB; + icode in { IIRMOVQ, IOPQ} : rB; + icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; + 1 : RNONE; # Don't write any register +]; + +## What register should be used as the M destination? +word dstM = [ + icode in { IMRMOVQ, IPOPQ } : rA; + 1 : RNONE; # Don't write any register +]; + +################ Execute Stage ################################### + +## Select input A to ALU +word aluA = [ + icode in { IRRMOVQ, IOPQ } : valA; + icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC; + icode in { ICALL, IPUSHQ } : -8; + icode in { IRET, IPOPQ } : 8; + # Other instructions don't need ALU +]; + +## Select input B to ALU +word aluB = [ + icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, + IPUSHQ, IRET, IPOPQ } : valB; + icode in { IRRMOVQ, IIRMOVQ } : 0; + # Other instructions don't need ALU +]; + +## Set the ALU function +word alufun = [ + icode == IOPQ : ifun; + 1 : ALUADD; +]; + +## Should the condition codes be updated? +bool set_cc = icode in { IOPQ }; + +################ Memory Stage ################################### + +## Set read control signal +bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET }; + +## Set write control signal +bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL }; + +## Select memory address +word mem_addr = [ + icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE; + icode in { IPOPQ, IRET } : valA; + # Other instructions don't need address +]; + +## Select memory input data +word mem_data = [ + # Value from register + icode in { IRMMOVQ, IPUSHQ } : valA; + # Return PC + icode == ICALL : valP; + # Default: Don't write anything +]; + +## Determine instruction status +word Stat = [ + imem_error || dmem_error : SADR; + !instr_valid: SINS; + icode == IHALT : SHLT; + 1 : SAOK; +]; + +################ Program Counter Update ############################ + +## What address should instruction be fetched at + +word new_pc = [ + # Call. Use instruction constant + icode == ICALL : valC; + # Taken branch. Use instruction constant + icode == IJXX && Cnd : valC; + # Completion of RET instruction. Use value from stack + icode == IRET : valM; + # Default: Use incremented PC + 1 : valP; +]; +#/* $end seq-all-hcl */ diff --git a/arch/sim/seq/seq.tcl b/arch/sim/seq/seq.tcl new file mode 100644 index 0000000..2917a36 --- /dev/null +++ b/arch/sim/seq/seq.tcl @@ -0,0 +1,540 @@ + +########################################################################## +# Parsing of command line flags # +########################################################################## + +proc flagVal {flag default} { + global argv + foreach t $argv { + if {[string match "-$flag*" $t]} {return [string range $t 2 end]} + } + return $default +} + +proc findFlag {flag} { + global argv + foreach t $argv { + if {[string match "-$flag" $t]} {return 1} + } + return 0 +} + +########################################################################## +# Register File Implementation. Shown as array of 8 columns # +########################################################################## + + +# Font used to display register contents +set fontSize [expr 10 * [flagVal "f" 12]] +set codeFontSize [expr 10 * [flagVal "c" 10]] +set labFontSize [expr 10 * [flagVal "l" 10]] +set bigFontSize [expr 10 * [flagVal "b" 16]] +set dpyFont "*-courier-medium-r-normal--*-$fontSize-*-*-*-*-*-*" +set labFont "*-helvetica-medium-r-normal--*-$labFontSize-*-*-*-*-*-*" +set bigLabFont "*-helvetica-bold-r-normal--*-$bigFontSize-*-*-*-*-*-*" +set codeFont "*-courier-medium-r-normal--*-$codeFontSize-*-*-*-*-*-*" +# Background Color of normal register +set normalBg white +# Background Color of highlighted register +set specialBg LightSkyBlue + +# Height of titles separating major sections of control panel +set sectionHeight 2 + +# How many rows of code do I display +set codeRowCount [flagVal "r" 50] + +# Keep track of previous highlighted register +set lastId -1 +proc setReg {id val highlight} { + global lastId normalBg specialBg + if {$lastId >= 0} { + .r.reg$lastId config -bg $normalBg + set lastId -1 + } + if {$id < 0 || $id >= 15} { + error "Invalid Register ($id)" + } + .r.reg$id config -text [format %16x $val] + if {$highlight} { + uplevel .r.reg$id config -bg $specialBg + set lastId $id + } +} + +# Clear all registers +proc clearReg {} { + global lastId normalBg + if {$lastId >= 0} { + .r.reg$lastId config -bg $normalBg + set lastId -1 + } + for {set i 0} {$i < 8} {incr i 1} { + .r.reg$i config -text "" + } +} + +# Set all 3 condition codes +proc setCC {zv cv ov} { + .cc.cc0 config -text [format %d $zv] + .cc.cc1 config -text [format %d $cv] + .cc.cc2 config -text [format %d $ov] +} + + +### Create display for misc. state +frame .flags +pack .flags -in . -side bottom + +############################################################################## +# Status Display # +############################################################################## + +set simStat "AOK" +# Line to display simulation status +frame .stat +pack .stat -in .flags -side left +label .stat.statlab -width 7 -text "Stat" -font $bigLabFont -height $sectionHeight +label .stat.statdpy -width 3 -font $dpyFont -relief ridge -bg white -textvariable simStat +label .stat.fill -width 6 -text "" +pack .stat.statlab .stat.statdpy .stat.fill -in .stat -side left +############################################################################## +# Condition Code Display # +############################################################################## +# Create Window for condition codes +frame .cc +pack .cc -in .flags -side right + +label .cc.lab -text "Condition Codes" -font $bigLabFont -height $sectionHeight +pack .cc.lab -in .cc -side left + + +set ccnames [list "Z" "S" "O"] + +# Create Row of CC Labels +for {set i 0} {$i < 3} {incr i 1} { + label .cc.lab$i -width 1 -font $dpyFont -text [lindex $ccnames $i] + pack .cc.lab$i -in .cc -side left + label .cc.cc$i -width 1 -font $dpyFont -relief ridge -bg $normalBg + pack .cc.cc$i -in .cc -side left +} + +############################################################################## +# Register Display # +############################################################################## + + +# Create Window for registers +frame .r +pack .r -in . -side bottom +# Following give separate window for register file +# toplevel .r +# wm title .r "Register File" +label .r.lab -text "Register File" -font $bigLabFont -height $sectionHeight +pack .r.lab -in .r -side top +# Set up top row control panel (disabled) +# frame .r.cntl +# pack .r.cntl -fill x -in .r +# label .r.labreg -text "Register" -width 10 +# entry .r.regid -width 3 -relief sunken -textvariable regId -font $dpyFont +# label .r.labval -text "Value" -width 10 +# entry .r.regval -width 8 -relief sunken -textvariable regVal -font $dpyFont +# button .r.doset -text "Set" -command {setReg $regId $regVal 1} -width 6 +# button .r.c -text "Clear" -command clearReg -width 6 +# pack .r.labreg .r.regid .r.labval .r.regval .r.doset .r.c -in .r.cntl -side left + +set regnames [list "%rax" "%rcx" "%rdx" "%rbx" "%rsp" "%rbp" "%rsi" "%rdi" "%r8 " "%r9 " "%r10" "%r11" "%r12" "%r13" "%r14" ""] + +# Create rows of register labels and displays +for {set j 0} {$j < 3} {incr j 1} { + frame .r.labels$j + pack .r.labels$j -side top -in .r + + for {set c 0} {$c < 5} {incr c 1} { + set i [expr $j * 5 + $c] + label .r.lab$i -width 16 -font $dpyFont -text [lindex $regnames $i] + pack .r.lab$i -in .r.labels$j -side left + } + + # Create Row of Register Entries + frame .r.row$j + pack .r.row$j -side top -in .r + + # Create 5 registers + for {set c 0} {$c < 5} {incr c 1} { + set i [expr $j * 5 + $c] + if {$i == 15} { + label .r.reg$i -width 16 -font $dpyFont -text "" + } else { + label .r.reg$i -width 16 -font $dpyFont -relief ridge \ + -bg $normalBg + } + pack .r.reg$i -in .r.row$j -side left + } + +} + +############################################################################## +# Main Control Panel # +############################################################################## + +# +# Set the simulator name (defined in simname in ssim.c) +# as the title of the main window +# +wm title . $simname + +# Control Panel for simulator +set cntlBW 11 +frame .cntl +pack .cntl +button .cntl.quit -width $cntlBW -text Quit -command exit +button .cntl.run -width $cntlBW -text Go -command simGo +button .cntl.stop -width $cntlBW -text Stop -command simStop +button .cntl.step -width $cntlBW -text Step -command simStep +button .cntl.reset -width $cntlBW -text Reset -command simResetAll +pack .cntl.quit .cntl.run .cntl.stop .cntl.step .cntl.reset -in .cntl -side left +# Simulation speed control +scale .spd -label {Simulator Speed (10*log Hz)} -from -10 -to 30 -length 10c \ + -orient horizontal -command setSpeed +pack .spd + +# Simulation mode +set simMode forward + +# frame .md +# pack .md +# radiobutton .md.wedged -text Wedged -variable simMode \ +# -value wedged -width 10 -command {setSimMode wedged} +# radiobutton .md.stall -text Stall -variable simMode \ +# -value stall -width 10 -command {setSimMode stall} +# radiobutton .md.forward -text Forward -variable simMode \ +# -value forward -width 10 -command {setSimMode forward} +# pack .md.wedged .md.stall .md.forward -in .md -side left + +# simDelay defines #milliseconds for each cycle of simulator +# Initial value is 1000ms +set simDelay 1000 +# Set delay based on rate expressed in log(Hz) +proc setSpeed {rate} { + global simDelay + set simDelay [expr round(1000 / pow(10,$rate/10.0))] +} + +# Global variables controlling simulator execution +# Should simulator be running now? +set simGoOK 0 + +proc simStop {} { + global simGoOK + set simGoOK 0 +} + +proc simStep {} { + global simStat + set simStat [simRun 1] +} + +proc simGo {} { + global simGoOK simDelay simStat + set simGoOK 1 + # Disable the Go and Step buttons + # Enable the Stop button + while {$simGoOK} { + # run the simulator 1 cycle + after $simDelay + set simStat [simRun 1] + if {$simStat != "AOK" && $simStat != "BUB"} {set simGoOK 0} + update + } + # Disable the Stop button + # Enable the Go and Step buttons +} + +############################################################################## +# Processor State display # +############################################################################## + +# Overall width of pipe register display +set procWidth 60 +set procHeight 1 +set labWidth 8 + +# Add labeled display to window +proc addDisp {win width name} { + global dpyFont labFont + set lname [string tolower $name] + frame $win.$lname + pack $win.$lname -in $win -side left + label $win.$lname.t -text $name -font $labFont + label $win.$lname.c -width $width -font $dpyFont -bg white -relief ridge + pack $win.$lname.t $win.$lname.c -in $win.$lname -side top + return [list $win.$lname.c] +} + +# Set text in display row +proc setDisp {wins txts} { + for {set i 0} {$i < [llength $wins] && $i < [llength $txts]} {incr i} { + set win [lindex $wins $i] + set txt [lindex $txts $i] + $win config -text $txt + } +} + +frame .p -width $procWidth +pack .p -in . -side bottom +label .p.lab -text "Processor State" -font $bigLabFont -height $sectionHeight +pack .p.lab -in .p -side top +label .p.pc -text "PC Update Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +#label .p.wb -text "Writeback Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.mem -text "Memory Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.ex -text "Execute Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.id -text "Decode Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +label .p.if -text "Fetch Stage" -height $procHeight -font $bigLabFont -width $procWidth -bg NavyBlue -fg White +# New PC +frame .p.npc +# Mem +frame .p.m +# Execute +frame .p.e +# Decode +frame .p.d +# Fetch +frame .p.f +# Old PC +frame .p.opc +pack .p.npc .p.pc .p.m .p.mem .p.e .p.ex .p.d .p.id .p.f .p.if .p.opc -in .p -side top -anchor w -expand 1 + +# Take list of lists, and transpose nesting +# Assumes all lists are of same length +proc ltranspose {inlist} { + set result {} + for {set i 0} {$i < [llength [lindex $inlist 0]]} {incr i} { + set nlist {} + for {set j 0} {$j < [llength $inlist]} {incr j} { + set ele [lindex [lindex $inlist $j] $i] + set nlist [concat $nlist [list $ele]] + } + set result [concat $result [list $nlist]] + } + return $result +} + +# Fields in PC displayed +# Total size = 16 +set pwins(OPC) [ltranspose [list [addDisp .p.opc 16 PC]]] + +# Fetch display +# Total size = 6+4+4+16+16 = 46 +set pwins(F) [ltranspose \ + [list [addDisp .p.f 6 Instr] \ + [addDisp .p.f 4 rA]\ + [addDisp .p.f 4 rB] \ + [addDisp .p.f 16 valC] \ + [addDisp .p.f 16 valP]]] + +# Decode Display +# Total size = 16+16+4+4+4+4 = 48 +set pwins(D) [ltranspose \ + [list \ + [addDisp .p.d 16 valA] \ + [addDisp .p.d 16 valB] \ + [addDisp .p.d 4 dstE] \ + [addDisp .p.d 4 dstM] \ + [addDisp .p.d 4 srcA] \ + [addDisp .p.d 4 srcB]]] + + + + +# Execute Display +# Total size = 3+16 = 19 +set pwins(E) [ltranspose \ + [list [addDisp .p.e 3 Cnd] \ + [addDisp .p.e 16 valE]]] + +# Memory Display +# Total size = 16 +set pwins(M) [ltranspose \ + [list [addDisp .p.m 16 valM]]] + +# New PC Display +# Total Size = 16 +set pwins(NPC) [ltranspose \ + [list [addDisp .p.npc 16 newPC]]] + +# update status line for specified proc register +proc updateStage {name txts} { + set Name [string toupper $name] + global pwins + set wins [lindex $pwins($Name) 0] + setDisp $wins $txts +} + +########################################################################## +# Instruction Display # +########################################################################## + +toplevel .c +wm title .c "Program Code" +frame .c.cntl +pack .c.cntl -in .c -side top -anchor w +label .c.filelab -width 10 -text "File" +entry .c.filename -width 20 -relief sunken -textvariable codeFile \ + -font $dpyFont -bg white +button .c.loadbutton -width $cntlBW -command {loadCode $codeFile} -text Load +pack .c.filelab .c.filename .c.loadbutton -in .c.cntl -side left + +proc clearCode {} { + simLabel {} {} + destroy .c.t + destroy .c.tr +} + +proc createCode {} { + # Create Code Structure + frame .c.t + pack .c.t -in .c -side top -anchor w + frame .c.tr + pack .c.tr -in .c.t -side top -anchor nw +} + +proc loadCode {file} { + # Kill old code window + clearCode + # Create new one + createCode + simCode $file + simResetAll +} + +# Start with initial code window, even though it will be destroyed. +createCode + +# Add a line of code to the display +proc addCodeLine {line addr op text} { + global codeRowCount + # Create new line in display + global codeFont + frame .c.tr.$addr + pack .c.tr.$addr -in .c.tr -side top -anchor w + label .c.tr.$addr.a -width 6 -text [format "0x%x" $addr] -font $codeFont + label .c.tr.$addr.i -width 20 -text $op -font $codeFont + label .c.tr.$addr.s -width 2 -text "" -font $codeFont -bg white + label .c.tr.$addr.t -text $text -font $codeFont + pack .c.tr.$addr.a .c.tr.$addr.i .c.tr.$addr.s \ + .c.tr.$addr.t -in .c.tr.$addr -side left +} + +# Keep track of which instructions have stage labels + +set oldAddr {} + +proc simLabel {addrs labs} { + global oldAddr + set newAddr {} + # Clear away any old labels + foreach a $oldAddr { + .c.tr.$a.s config -text "" + } + for {set i 0} {$i < [llength $addrs]} {incr i} { + set a [lindex $addrs $i] + set t [lindex $labs $i] + if {[winfo exists .c.tr.$a]} { + .c.tr.$a.s config -text $t + set newAddr [concat $newAddr $a] + } + } + set oldAddr $newAddr +} + +proc simResetAll {} { + global simStat + set simStat "AOK" + simReset + simLabel {} {} + clearMem +} + +############################################################################### +# Memory Display # +############################################################################### +toplevel .m +wm title .m "Memory Contents" +frame .m.t +pack .m.t -in .m -side top -anchor w + +label .m.t.lab -width 6 -font $dpyFont -text " " +pack .m.t.lab -in .m.t -side left +for {set i 0} {$i < 16} {incr i 8} { + label .m.t.a$i -width 16 -font $dpyFont -text [format " 0x---%x" [expr $i % 16]] + pack .m.t.a$i -in .m.t -side left +} + + +# Keep track of range of addresses currently displayed +set minAddr 0 +set memCnt 0 +set haveMem 0 + +proc createMem {nminAddr nmemCnt} { + global minAddr memCnt haveMem codeFont dpyFont normalBg + set minAddr $nminAddr + set memCnt $nmemCnt + + if { $haveMem } { destroy .m.e } + + # Create Memory Structure + frame .m.e + set haveMem 1 + pack .m.e -in .m -side top -anchor w + # Now fill it with values + for {set i 0} {$i < $memCnt} {incr i 16} { + set addr [expr $minAddr + $i] + + frame .m.e.r$i + pack .m.e.r$i -side bottom -in .m.e + label .m.e.r$i.lab -width 6 -font $dpyFont -text [format "0x%.3x-" [expr $addr / 16]] + pack .m.e.r$i.lab -in .m.e.r$i -side left + + for {set j 0} {$j < 16} {incr j 8} { + set a [expr $addr + $j] + label .m.e.v$a -width 16 -font $dpyFont -relief ridge \ + -bg $normalBg + pack .m.e.v$a -in .m.e.r$i -side left + } + } +} + +proc setMem {Addr Val} { + global minAddr memCnt + if {$Addr < $minAddr || $Addr > [expr $minAddr + $memCnt]} { + error "Memory address $Addr out of range" + } + .m.e.v$Addr config -text [format %16x $Val] +} + +proc clearMem {} { + destroy .m.e + createMem 0 0 +} + + + +############################################################################### +# Command Line Initialization # +############################################################################### + +# Get code file name from input + +# Find file with specified extension +proc findFile {tlist ext} { + foreach t $tlist { + if {[string match "*.$ext" $t]} {return $t} + } + return "" +} + + +set codeFile [findFile $argv yo] +if {$codeFile != ""} { loadCode $codeFile} diff --git a/arch/sim/seq/sim.h b/arch/sim/seq/sim.h new file mode 100644 index 0000000..e5bf485 --- /dev/null +++ b/arch/sim/seq/sim.h @@ -0,0 +1,108 @@ + +/********** Defines **************/ + +/* Get ra out of one byte regid field */ +#define GET_RA(r) HI4(r) + +/* Get rb out of one byte regid field */ +#define GET_RB(r) LO4(r) + + +/************ Global state declaration ****************/ + +/* Determines whether running SEQ or SEQ+ */ +extern int plusmode; + +/* Both instruction and data memory */ +extern mem_t mem; + +/* Keep track of range of addresses that have been written */ +extern word_t minAddr; +extern word_t memCnt; + +/* Register file */ +extern mem_t reg; +/* Condition code register */ +extern cc_t cc; +/* Program counter */ +extern word_t pc; + +/* For seq+ */ +/* Results computed by previous instruction. + Used to compute PC in current instruction */ +extern byte_t prev_icode; +extern byte_t prev_ifun; +extern word_t prev_valc; +extern word_t prev_valm; +extern word_t prev_valp; +extern bool_t prev_bcond; + +/* Intermdiate stage values that must be used by control functions */ +extern byte_t imem_icode; +extern byte_t imem_ifun; +extern byte_t icode; +extern word_t ifun; +extern word_t ra; +extern word_t rb; +extern word_t valc; +extern word_t valp; +extern bool_t imem_error; +extern bool_t instr_valid; +extern word_t vala; +extern word_t valb; +extern word_t vale; +extern bool_t bcond; +extern bool_t cond; +extern word_t valm; +extern bool_t dmem_error; +extern byte_t status; + +/* Log file */ +extern FILE *dumpfile; + + +/* Sets the simulator name (called from main routine in HCL file) */ +void set_simname(char *name); + +/* Initialize simulator */ +void sim_init(); + +/* Reset simulator state, including register, instruction, and data memories */ +void sim_reset(); + +/* + Run processor until one of following occurs: + - An status error is encountered + - max_instr instructions have completed + + Return number of instructions executed. + if statusp nonnull, then will be set to status of final instruction + if ccp nonnull, then will be set to condition codes of final instruction +*/ +word_t sim_run(word_t max_instr, byte_t *statusp, cc_t *ccp); + +/* If dumpfile set nonNULL, lots of status info printed out */ +void sim_set_dumpfile(FILE *file); + +/* + * sim_log dumps a formatted string to the dumpfile, if it exists + * accepts variable argument list + */ +void sim_log( const char *format, ... ); + + +/******************* GUI Interface Functions **********************/ +#ifdef HAS_GUI + +void signal_register_clear(); + +void report_pc(word_t pc); + +void report_state(char *id, char *txt); + +void show_cc(cc_t cc); + +void create_memory_display(); +void set_memory(word_t addr, word_t val); +#endif + diff --git a/arch/sim/seq/ssim.c b/arch/sim/seq/ssim.c new file mode 100644 index 0000000..4cae5a9 --- /dev/null +++ b/arch/sim/seq/ssim.c @@ -0,0 +1,1169 @@ +/*********************************************************************** + * + * ssim.c - Sequential Y86-64 simulator + * + * Copyright (c) 2002, 2015. Bryant and D. O'Hallaron, All rights reserved. + * May not be used, modified, or copied without permission. + ***********************************************************************/ + +#include +#include +#include +#include +#include +#include "isa.h" +#include "sim.h" + +#define MAXBUF 1024 + +#ifdef HAS_GUI +#include +#endif /* HAS_GUI */ + +#define MAXARGS 128 +#define MAXBUF 1024 +#define TKARGS 3 + +/*************** + * Begin Globals + ***************/ + +/* Simulator name defined and initialized by the compiled HCL file */ +/* according to the -n argument supplied to hcl2c */ +extern char simname[]; + +/* SEQ=0, SEQ+=1. Modified by HCL main() */ +int plusmode = 0; + +/* Parameters modifed by the command line */ +int gui_mode = FALSE; /* Run in GUI mode instead of TTY mode? (-g) */ +char *object_filename; /* The input object file name. */ +FILE *object_file; /* Input file handle */ +bool_t verbosity = 2; /* Verbosity level [TTY only] (-v) */ +word_t instr_limit = 10000; /* Instruction limit [TTY only] (-l) */ +bool_t do_check = FALSE; /* Test with YIS? [TTY only] (-t) */ + +/************* + * End Globals + *************/ + + +/*************************** + * Begin function prototypes + ***************************/ + +static void usage(char *name); /* Print helpful usage message */ +static void run_tty_sim(); /* Run simulator in TTY mode */ + +#ifdef HAS_GUI +void addAppCommands(Tcl_Interp *interp); /* Add application-dependent commands */ +#endif /* HAS_GUI */ + +/************************* + * End function prototypes + *************************/ + + +/******************************************************************* + * Part 1: This part is the initial entry point that handles general + * initialization. It parses the command line and does any necessary + * setup to run in either TTY or GUI mode, and then starts the + * simulation. + *******************************************************************/ + +/* + * sim_main - main simulator routine. This function is called from the + * main() routine in the HCL file. + */ +int sim_main(int argc, char **argv) +{ + int i; + int c; + char *myargv[MAXARGS]; + + + /* Parse the command line arguments */ + while ((c = getopt(argc, argv, "htgl:v:")) != -1) { + switch(c) { + case 'h': + usage(argv[0]); + break; + case 'l': + instr_limit = atoll(optarg); + break; + case 'v': + verbosity = atoi(optarg); + if (verbosity < 0 || verbosity > 2) { + printf("Invalid verbosity %d\n", verbosity); + usage(argv[0]); + } + break; + case 't': + do_check = TRUE; + break; + case 'g': + gui_mode = TRUE; + break; + default: + printf("Invalid option '%c'\n", c); + usage(argv[0]); + break; + } + } + + + /* Do we have too many arguments? */ + if (optind < argc - 1) { + printf("Too many command line arguments:"); + for (i = optind; i < argc; i++) + printf(" %s", argv[i]); + printf("\n"); + usage(argv[0]); + } + + + /* The single unflagged argument should be the object file name */ + object_filename = NULL; + object_file = NULL; + if (optind < argc) { + object_filename = argv[optind]; + object_file = fopen(object_filename, "r"); + if (!object_file) { + fprintf(stderr, "Couldn't open object file %s\n", object_filename); + exit(1); + } + } + + + /* Run the simulator in GUI mode (-g flag) */ + if (gui_mode) { + +#ifndef HAS_GUI + printf("To run in GUI mode, you must recompile with the HAS_GUI constant defined.\n"); + exit(1); +#endif /* HAS_GUI */ + + /* In GUI mode, we must specify the object file on command line */ + if (!object_file) { + printf("Missing object file argument in GUI mode\n"); + usage(argv[0]); + } + + /* Build the command line for the GUI simulator */ + for (i = 0; i < TKARGS; i++) { + if ((myargv[i] = malloc(MAXBUF*sizeof(char))) == NULL) { + perror("malloc error"); + exit(1); + } + } + strcpy(myargv[0], argv[0]); + +#if 0 + printf("argv[0]=%s\n", argv[0]); + { + char buf[1000]; + getcwd(buf, 1000); + printf("cwd=%s\n", buf); + } +#endif + + if (plusmode == 0) /* SEQ */ + strcpy(myargv[1], "seq.tcl"); + else + strcpy(myargv[1], "seq+.tcl"); + strcpy(myargv[2], object_filename); + myargv[3] = NULL; + + /* Start the GUI simulator */ +#ifdef HAS_GUI + Tk_Main(TKARGS, myargv, Tcl_AppInit); +#endif /* HAS_GUI */ + exit(0); + } + + /* Otherwise, run the simulator in TTY mode (no -g flag) */ + run_tty_sim(); + + exit(0); +} + +/* + * run_tty_sim - Run the simulator in TTY mode + */ +static void run_tty_sim() +{ + word_t icount = 0; + status = STAT_AOK; + cc_t result_cc = 0; + word_t byte_cnt = 0; + mem_t mem0, reg0; + state_ptr isa_state = NULL; + + + /* In TTY mode, the default object file comes from stdin */ + if (!object_file) { + object_file = stdin; + } + + /* Initializations */ + if (verbosity >= 2) + sim_set_dumpfile(stdout); + sim_init(); + + /* Emit simulator name */ + printf("%s\n", simname); + + byte_cnt = load_mem(mem, object_file, 1); + if (byte_cnt == 0) { + fprintf(stderr, "No lines of code found\n"); + exit(1); + } else if (verbosity >= 2) { + printf("%lld bytes of code read\n", byte_cnt); + } + fclose(object_file); + if (do_check) { + isa_state = new_state(0); + free_mem(isa_state->r); + free_mem(isa_state->m); + isa_state->m = copy_mem(mem); + isa_state->r = copy_mem(reg); + isa_state->cc = cc; + } + + mem0 = copy_mem(mem); + reg0 = copy_mem(reg); + + + icount = sim_run(instr_limit, &status, &result_cc); + if (verbosity > 0) { + printf("%lld instructions executed\n", icount); + printf("Status = %s\n", stat_name(status)); + printf("Condition Codes: %s\n", cc_name(result_cc)); + printf("Changed Register State:\n"); + diff_reg(reg0, reg, stdout); + printf("Changed Memory State:\n"); + diff_mem(mem0, mem, stdout); + } + if (do_check) { + byte_t e = STAT_AOK; + int step; + bool_t match = TRUE; + + for (step = 0; step < instr_limit && e == STAT_AOK; step++) { + e = step_state(isa_state, stdout); + } + + if (diff_reg(isa_state->r, reg, NULL)) { + match = FALSE; + if (verbosity > 0) { + printf("ISA Register != Pipeline Register File\n"); + diff_reg(isa_state->r, reg, stdout); + } + } + if (diff_mem(isa_state->m, mem, NULL)) { + match = FALSE; + if (verbosity > 0) { + printf("ISA Memory != Pipeline Memory\n"); + diff_mem(isa_state->m, mem, stdout); + } + } + if (isa_state->cc != result_cc) { + match = FALSE; + if (verbosity > 0) { + printf("ISA Cond. Codes (%s) != Pipeline Cond. Codes (%s)\n", + cc_name(isa_state->cc), cc_name(result_cc)); + } + } + if (match) { + printf("ISA Check Succeeds\n"); + } else { + printf("ISA Check Fails\n"); + } + } +} + + + +/* + * usage - print helpful diagnostic information + */ +static void usage(char *name) +{ + printf("Usage: %s [-htg] [-l m] [-v n] file.yo\n", name); + printf("file.yo required in GUI mode, optional in TTY mode (default stdin)\n"); + printf(" -h Print this message\n"); + printf(" -g Run in GUI mode instead of TTY mode (default TTY)\n"); + printf(" -l m Set instruction limit to m [TTY mode only] (default %lld)\n", instr_limit); + printf(" -v n Set verbosity level to 0 <= n <= 2 [TTY mode only] (default %d)\n", verbosity); + printf(" -t Test result against ISA simulator (yis) [TTY mode only]\n"); + exit(0); +} + + + +/********************************************************* + * Part 2: This part contains the core simulator routines. + *********************************************************/ + +/********************** + * Begin Part 2 Globals + **********************/ + +/* + * Variables related to hardware units in the processor + */ +mem_t mem; /* Instruction and data memory */ +word_t minAddr = 0; +word_t memCnt = 0; + +/* Other processor state */ +mem_t reg; /* Register file */ +cc_t cc = DEFAULT_CC; /* Condition code register */ +cc_t cc_in = DEFAULT_CC; /* Input to condition code register */ + +/* + * SEQ+: Results computed by previous instruction. + * Used to compute PC in current instruction + */ +byte_t prev_icode = I_NOP; +byte_t prev_ifun = 0; +word_t prev_valc = 0; +word_t prev_valm = 0; +word_t prev_valp = 0; +bool_t prev_bcond = FALSE; + +byte_t prev_icode_in = I_NOP; +byte_t prev_ifun_in = 0; +word_t prev_valc_in = 0; +word_t prev_valm_in = 0; +word_t prev_valp_in = 0; +bool_t prev_bcond_in = FALSE; + + +/* Program Counter */ +word_t pc = 0; /* Program counter value */ +word_t pc_in = 0;/* Input to program counter */ + +/* Intermediate values */ +byte_t imem_icode = I_NOP; +byte_t imem_ifun = F_NONE; +byte_t icode = I_NOP; +word_t ifun = 0; +byte_t instr = HPACK(I_NOP, F_NONE); +word_t ra = REG_NONE; +word_t rb = REG_NONE; +word_t valc = 0; +word_t valp = 0; +bool_t imem_error; +bool_t instr_valid; + +word_t srcA = REG_NONE; +word_t srcB = REG_NONE; +word_t destE = REG_NONE; +word_t destM = REG_NONE; +word_t vala = 0; +word_t valb = 0; +word_t vale = 0; + +bool_t bcond = FALSE; +bool_t cond = FALSE; +word_t valm = 0; +bool_t dmem_error; + +bool_t mem_write = FALSE; +word_t mem_addr = 0; +word_t mem_data = 0; +byte_t status = STAT_AOK; + + +/* Values computed by control logic */ +word_t gen_pc(); /* SEQ+ */ +word_t gen_icode(); +word_t gen_ifun(); +word_t gen_need_regids(); +word_t gen_need_valC(); +word_t gen_instr_valid(); +word_t gen_srcA(); +word_t gen_srcB(); +word_t gen_dstE(); +word_t gen_dstM(); +word_t gen_aluA(); +word_t gen_aluB(); +word_t gen_alufun(); +word_t gen_set_cc(); +word_t gen_mem_addr(); +word_t gen_mem_data(); +word_t gen_mem_read(); +word_t gen_mem_write(); +word_t gen_Stat(); +word_t gen_new_pc(); + +/* Log file */ +FILE *dumpfile = NULL; + +#ifdef HAS_GUI +/* Representations of digits */ +static char digits[16] = + {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; +#endif /* HAS_GUI */ + +/******************** + * End Part 2 Globals + ********************/ + +#ifdef HAS_GUI + +/* Create string in hex/oct/binary format with leading zeros */ +/* bpd denotes bits per digit Should be in range 1-4, + bpw denotes bits per word.*/ +void wstring(uword_t x, int bpd, int bpw, char *str) +{ + int digit; + uword_t mask = ((uword_t) 1 << bpd) - 1; + for (digit = (bpw-1)/bpd; digit >= 0; digit--) { + uword_t val = (x >> (digit * bpd)) & mask; + *str++ = digits[val]; + } + *str = '\0'; +} + +/* used for formatting instructions */ +static char status_msg[128]; + +/* SEQ+ */ +static char *format_prev() +{ + char istring[17]; + char mstring[17]; + char pstring[17]; + wstring(prev_valc, 4, 64, istring); + wstring(prev_valm, 4, 64, mstring); + wstring(prev_valp, 4, 64, pstring); + sprintf(status_msg, "%c %s %s %s %s", + prev_bcond ? 'Y' : 'N', + iname(HPACK(prev_icode, prev_ifun)), + istring, mstring, pstring); + + return status_msg; +} + +static char *format_pc() +{ + char pstring[17]; + wstring(pc, 4, 64, pstring); + sprintf(status_msg, "%s", pstring); + return status_msg; +} + +static char *format_f() +{ + char valcstring[17]; + char valpstring[17]; + wstring(valc, 4, 64, valcstring); + wstring(valp, 4, 64, valpstring); + sprintf(status_msg, "%s %s %s %s %s", + iname(HPACK(icode, ifun)), + reg_name(ra), + reg_name(rb), + valcstring, + valpstring); + return status_msg; +} + +static char *format_d() +{ + char valastring[17]; + char valbstring[17]; + wstring(vala, 4, 64, valastring); + wstring(valb, 4, 64, valbstring); + sprintf(status_msg, "%s %s %s %s %s %s", + valastring, + valbstring, + reg_name(destE), + reg_name(destM), + reg_name(srcA), + reg_name(srcB)); + + return status_msg; +} + +static char *format_e() +{ + char valestring[17]; + wstring(vale, 4, 64, valestring); + sprintf(status_msg, "%c %s", + bcond ? 'Y' : 'N', + valestring); + return status_msg; +} + +static char *format_m() +{ + char valmstring[17]; + wstring(valm, 4, 64, valmstring); + sprintf(status_msg, "%s", valmstring); + return status_msg; +} + +static char *format_npc() +{ + char npcstring[17]; + wstring(pc_in, 4, 64, npcstring); + sprintf(status_msg, "%s", npcstring); + return status_msg; +} +#endif /* HAS_GUI */ + +/* Report system state */ +static void sim_report() { + +#ifdef HAS_GUI + if (gui_mode) { + report_pc(pc); + if (plusmode) { + report_state("PREV", format_prev()); + report_state("PC", format_pc()); + } else { + report_state("OPC", format_pc()); + } + report_state("F", format_f()); + report_state("D", format_d()); + report_state("E", format_e()); + report_state("M", format_m()); + if (!plusmode) { + report_state("NPC", format_npc()); + } + show_cc(cc); + } +#endif /* HAS_GUI */ + +} + +static int initialized = 0; +void sim_init() +{ + + /* Create memory and register files */ + initialized = 1; + mem = init_mem(MEM_SIZE); + reg = init_reg(); + sim_reset(); + clear_mem(mem); +} + +void sim_reset() +{ + if (!initialized) + sim_init(); + clear_mem(reg); + minAddr = 0; + memCnt = 0; + +#ifdef HAS_GUI + if (gui_mode) { + signal_register_clear(); + create_memory_display(); + sim_report(); + } +#endif + + if (plusmode) { + prev_icode = prev_icode_in = I_NOP; + prev_ifun = prev_ifun_in = 0; + prev_valc = prev_valc_in = 0; + prev_valm = prev_valm_in = 0; + prev_valp = prev_valp_in = 0; + prev_bcond = prev_bcond_in = FALSE; + pc = 0; + } else { + pc_in = 0; + } + cc = DEFAULT_CC; + cc_in = DEFAULT_CC; + destE = REG_NONE; + destM = REG_NONE; + mem_write = FALSE; + mem_addr = 0; + mem_data = 0; + + /* Reset intermediate values to clear display */ + icode = I_NOP; + ifun = 0; + instr = HPACK(I_NOP, F_NONE); + ra = REG_NONE; + rb = REG_NONE; + valc = 0; + valp = 0; + + srcA = REG_NONE; + srcB = REG_NONE; + destE = REG_NONE; + destM = REG_NONE; + vala = 0; + valb = 0; + vale = 0; + + cond = FALSE; + bcond = FALSE; + valm = 0; + + sim_report(); +} + +/* Update the processor state */ +static void update_state() +{ + if (plusmode) { + prev_icode = prev_icode_in; + prev_ifun = prev_ifun_in; + prev_valc = prev_valc_in; + prev_valm = prev_valm_in; + prev_valp = prev_valp_in; + prev_bcond = prev_bcond_in; + } else { + pc = pc_in; + } + cc = cc_in; + /* Writeback */ + if (destE != REG_NONE) + set_reg_val(reg, destE, vale); + if (destM != REG_NONE) + set_reg_val(reg, destM, valm); + + if (mem_write) { + /* Should have already tested this address */ + set_word_val(mem, mem_addr, mem_data); + sim_log("Wrote 0x%llx to address 0x%llx\n", mem_data, mem_addr); +#ifdef HAS_GUI + if (gui_mode) { + if (mem_addr % 8 != 0) { + /* Just did a misaligned write. + Need to display both words */ + word_t align_addr = mem_addr & ~0x3; + word_t val; + get_word_val(mem, align_addr, &val); + set_memory(align_addr, val); + align_addr+=8; + get_word_val(mem, align_addr, &val); + set_memory(align_addr, val); + } else { + set_memory(mem_addr, mem_data); + } + } +#endif /* HAS_GUI */ + } +} + +/* Execute one instruction */ +/* Return resulting status */ +static byte_t sim_step() +{ + word_t aluA; + word_t aluB; + word_t alufun; + + status = STAT_AOK; + imem_error = dmem_error = FALSE; + + update_state(); /* Update state from last cycle */ + + if (plusmode) { + pc = gen_pc(); + } + valp = pc; + instr = HPACK(I_NOP, F_NONE); + imem_error = !get_byte_val(mem, valp, &instr); + if (imem_error) { + sim_log("Couldn't fetch at address 0x%llx\n", valp); + } + imem_icode = HI4(instr); + imem_ifun = LO4(instr); + icode = gen_icode(); + ifun = gen_ifun(); + instr_valid = gen_instr_valid(); + valp++; + if (gen_need_regids()) { + byte_t regids; + if (get_byte_val(mem, valp, ®ids)) { + ra = GET_RA(regids); + rb = GET_RB(regids); + } else { + ra = REG_NONE; + rb = REG_NONE; + status = STAT_ADR; + sim_log("Couldn't fetch at address 0x%llx\n", valp); + } + valp++; + } else { + ra = REG_NONE; + rb = REG_NONE; + } + + if (gen_need_valC()) { + if (get_word_val(mem, valp, &valc)) { + } else { + valc = 0; + status = STAT_ADR; + sim_log("Couldn't fetch at address 0x%llx\n", valp); + } + valp+=8; + } else { + valc = 0; + } + sim_log("IF: Fetched %s at 0x%llx. ra=%s, rb=%s, valC = 0x%llx\n", + iname(HPACK(icode,ifun)), pc, reg_name(ra), reg_name(rb), valc); + + if (status == STAT_AOK && icode == I_HALT) { + status = STAT_HLT; + } + + srcA = gen_srcA(); + if (srcA != REG_NONE) { + vala = get_reg_val(reg, srcA); + } else { + vala = 0; + } + + srcB = gen_srcB(); + if (srcB != REG_NONE) { + valb = get_reg_val(reg, srcB); + } else { + valb = 0; + } + + cond = cond_holds(cc, ifun); + + destE = gen_dstE(); + destM = gen_dstM(); + + aluA = gen_aluA(); + aluB = gen_aluB(); + alufun = gen_alufun(); + vale = compute_alu(alufun, aluA, aluB); + cc_in = cc; + if (gen_set_cc()) + cc_in = compute_cc(alufun, aluA, aluB); + + bcond = cond && (icode == I_JMP); + + mem_addr = gen_mem_addr(); + mem_data = gen_mem_data(); + + + if (gen_mem_read()) { + dmem_error = dmem_error || !get_word_val(mem, mem_addr, &valm); + if (dmem_error) { + sim_log("Couldn't read at address 0x%llx\n", mem_addr); + } + } else + valm = 0; + + mem_write = gen_mem_write(); + if (mem_write) { + /* Do a test read of the data memory to make sure address is OK */ + word_t junk; + dmem_error = dmem_error || !get_word_val(mem, mem_addr, &junk); + } + + status = gen_Stat(); + + if (plusmode) { + prev_icode_in = icode; + prev_ifun_in = ifun; + prev_valc_in = valc; + prev_valm_in = valm; + prev_valp_in = valp; + prev_bcond_in = bcond; + } else { + /* Update PC */ + pc_in = gen_new_pc(); + } + sim_report(); + return status; +} + +/* + Run processor until one of following occurs: + - An error status is encountered in WB. + - max_instr instructions have completed through WB + + Return number of instructions executed. + if statusp nonnull, then will be set to status of final instruction + if ccp nonnull, then will be set to condition codes of final instruction +*/ +word_t sim_run(word_t max_instr, byte_t *statusp, cc_t *ccp) +{ + word_t icount = 0; + byte_t run_status = STAT_AOK; + while (icount < max_instr) { + run_status = sim_step(); + icount++; + if (run_status != STAT_AOK) + break; + } + if (statusp) + *statusp = run_status; + if (ccp) + *ccp = cc; + return icount; +} + +/* If dumpfile set nonNULL, lots of status info printed out */ +void sim_set_dumpfile(FILE *df) +{ + dumpfile = df; +} + +/* + * sim_log dumps a formatted string to the dumpfile, if it exists + * accepts variable argument list + */ +void sim_log( const char *format, ... ) { + if (dumpfile) { + va_list arg; + va_start( arg, format ); + vfprintf( dumpfile, format, arg ); + va_end( arg ); + } +} + + +/************************************************************* + * Part 3: This part contains simulation control for the TK + * simulator. + *************************************************************/ + +#ifdef HAS_GUI + +/********************** + * Begin Part 3 globals + **********************/ + +/* Hack for SunOS */ +extern int matherr(); +int *tclDummyMathPtr = (int *) matherr; + +static char tcl_msg[256]; + +/* Keep track of the TCL Interpreter */ +static Tcl_Interp *sim_interp = NULL; + +static mem_t post_load_mem; + +/********************** + * End Part 3 globals + **********************/ + + +/* function prototypes */ +int simResetCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); +int simLoadCodeCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); +int simLoadDataCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); +int simRunCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]); +void addAppCommands(Tcl_Interp *interp); + +/****************************************************************************** + * tcl command definitions + ******************************************************************************/ + +/* Implement command versions of the simulation functions */ +int simResetCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + sim_interp = interp; + if (argc != 1) { + interp->result = "No arguments allowed"; + return TCL_ERROR; + } + sim_reset(); + if (post_load_mem) { + free_mem(mem); + mem = copy_mem(post_load_mem); + } + interp->result = stat_name(STAT_AOK); + return TCL_OK; +} + +int simLoadCodeCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + FILE *object_file; + word_t code_count; + sim_interp = interp; + if (argc != 2) { + interp->result = "One argument required"; + return TCL_ERROR; + } + object_file = fopen(argv[1], "r"); + if (!object_file) { + sprintf(tcl_msg, "Couldn't open code file '%s'", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + sim_reset(); + code_count = load_mem(mem, object_file, 0); + post_load_mem = copy_mem(mem); + sprintf(tcl_msg, "%lld", code_count); + interp->result = tcl_msg; + fclose(object_file); + return TCL_OK; +} + +int simLoadDataCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + FILE *data_file; + word_t word_count = 0; + interp->result = "Not implemented"; + return TCL_ERROR; + + + sim_interp = interp; + if (argc != 2) { + interp->result = "One argument required"; + return TCL_ERROR; + } + data_file = fopen(argv[1], "r"); + if (!data_file) { + sprintf(tcl_msg, "Couldn't open data file '%s'", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + sprintf(tcl_msg, "%lld", word_count); + interp->result = tcl_msg; + fclose(data_file); + return TCL_OK; +} + + +int simRunCmd(ClientData clientData, Tcl_Interp *interp, + int argc, char *argv[]) +{ + word_t step_limit = 1; + byte_t run_status; + cc_t cc; + sim_interp = interp; + if (argc > 2) { + interp->result = "At most one argument allowed"; + return TCL_ERROR; + } + if (argc >= 2 && + (sscanf(argv[1], "%lld", &step_limit) != 1 || + step_limit < 0)) { + sprintf(tcl_msg, "Cannot run for '%s' cycles!", argv[1]); + interp->result = tcl_msg; + return TCL_ERROR; + } + sim_run(step_limit, &run_status, &cc); + interp->result = stat_name(run_status); + return TCL_OK; +} + +/****************************************************************************** + * registering the commands with tcl + ******************************************************************************/ + +void addAppCommands(Tcl_Interp *interp) +{ + sim_interp = interp; + Tcl_CreateCommand(interp, "simReset", (Tcl_CmdProc *) simResetCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "simCode", (Tcl_CmdProc *) simLoadCodeCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "simData", (Tcl_CmdProc *) simLoadDataCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_CreateCommand(interp, "simRun", (Tcl_CmdProc *) simRunCmd, + (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); +} + +/****************************************************************************** + * tcl functionality called from within C + ******************************************************************************/ + +/* Provide mechanism for simulator to update register display */ +void signal_register_update(reg_id_t r, word_t val) { + int code; + sprintf(tcl_msg, "setReg %d %lld 1", (int) r, (word_t) val); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to signal register set\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to generate memory display */ +void create_memory_display() { + int code; + sprintf(tcl_msg, "createMem %lld %lld", minAddr, memCnt); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Command '%s' failed\n", tcl_msg); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } else { + word_t i; + for (i = 0; i < memCnt && code == TCL_OK; i+=8) { + word_t addr = minAddr+i; + word_t val; + if (!get_word_val(mem, addr, &val)) { + fprintf(stderr, "Out of bounds memory display\n"); + return; + } + sprintf(tcl_msg, "setMem %lld %lld", addr, val); + code = Tcl_Eval(sim_interp, tcl_msg); + } + if (code != TCL_OK) { + fprintf(stderr, "Couldn't set memory value\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } + } +} + +/* Provide mechanism for simulator to update memory value */ +void set_memory(word_t addr, word_t val) { + int code; + word_t nminAddr = minAddr; + word_t nmemCnt = memCnt; + + /* First see if we need to expand memory range */ + if (memCnt == 0) { + nminAddr = addr; + nmemCnt = 8; + } else if (addr < minAddr) { + nminAddr = addr; + nmemCnt = minAddr + memCnt - addr; + } else if (addr >= minAddr+memCnt) { + nmemCnt = addr-minAddr+8; + } + /* Now make sure nminAddr & nmemCnt are multiples of 16 */ + nmemCnt = ((nminAddr & 0xF) + nmemCnt + 0xF) & ~0xF; + nminAddr = nminAddr & ~0xF; + + if (nminAddr != minAddr || nmemCnt != memCnt) { + minAddr = nminAddr; + memCnt = nmemCnt; + create_memory_display(); + } else { + sprintf(tcl_msg, "setMem %lld %lld", addr, val); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Couldn't set memory value 0x%llx to 0x%llx\n", + addr, val); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } + } +} + +/* Provide mechanism for simulator to update condition code display */ +void show_cc(cc_t cc) +{ + int code; + sprintf(tcl_msg, "setCC %d %d %d", + GET_ZF(cc), GET_SF(cc), GET_OF(cc)); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to display condition codes\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to clear register display */ +void signal_register_clear() { + int code; + code = Tcl_Eval(sim_interp, "clearReg"); + if (code != TCL_OK) { + fprintf(stderr, "Failed to signal register clear\n"); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Provide mechanism for simulator to report instructions as they are + read in +*/ + +void report_line(word_t line_no, word_t addr, char *hex, char *text) { + int code; + sprintf(tcl_msg, "addCodeLine %lld %lld {%s} {%s}", line_no, addr, hex, text); + code = Tcl_Eval(sim_interp, tcl_msg); + if (code != TCL_OK) { + fprintf(stderr, "Failed to report code line 0x%llx\n", addr); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + + +/* Provide mechanism for simulator to report which instruction + is being executed */ +void report_pc(word_t pc) +{ + int t_status; + char addr[18]; + char code[20]; + Tcl_DString cmd; + Tcl_DStringInit(&cmd); + Tcl_DStringAppend(&cmd, "simLabel ", -1); + Tcl_DStringStartSublist(&cmd); + sprintf(addr, "%llu", pc); + Tcl_DStringAppendElement(&cmd, addr); + + Tcl_DStringEndSublist(&cmd); + Tcl_DStringStartSublist(&cmd); + sprintf(code, "%s","*"); + Tcl_DStringAppend(&cmd, code, -1); + Tcl_DStringEndSublist(&cmd); + t_status = Tcl_Eval(sim_interp, Tcl_DStringValue(&cmd)); + if (t_status != TCL_OK) { + fprintf(stderr, "Failed to report code '%s'\n", code); + fprintf(stderr, "Error Message was '%s'\n", sim_interp->result); + } +} + +/* Report single line of stage state */ +void report_state(char *id, char *txt) +{ + int t_status; + sprintf(tcl_msg, "updateStage %s {%s}", id, txt); + t_status = Tcl_Eval(sim_interp, tcl_msg); + if (t_status != TCL_OK) { + fprintf(stderr, "Failed to report processor status\n"); + fprintf(stderr, "\tStage %s, status '%s'\n", + id, txt); + fprintf(stderr, "\tError Message was '%s'\n", sim_interp->result); + } +} + +/* + * Tcl_AppInit - Called by TCL to perform application-specific initialization. + */ +int Tcl_AppInit(Tcl_Interp *interp) +{ + /* Tell TCL about the name of the simulator so it can */ + /* use it as the title of the main window */ + Tcl_SetVar(interp, "simname", simname, TCL_GLOBAL_ONLY); + + if (Tcl_Init(interp) == TCL_ERROR) + return TCL_ERROR; + if (Tk_Init(interp) == TCL_ERROR) + return TCL_ERROR; + Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); + + /* Call procedure to add new commands */ + addAppCommands(interp); + + /* + * Specify a user-specific startup file to invoke if the application + * is run interactively. Typically the startup file is "~/.apprc" + * where "app" is the name of the application. If this line is deleted + * then no user-specific startup file will be run under any conditions. + */ + Tcl_SetVar(interp, "tcl_rcFileName", "~/.wishrc", TCL_GLOBAL_ONLY); + return TCL_OK; + +} + + +#endif /* HAS_GUI */ diff --git a/arch/sim/y86-code/Makefile b/arch/sim/y86-code/Makefile new file mode 100644 index 0000000..12bc0ae --- /dev/null +++ b/arch/sim/y86-code/Makefile @@ -0,0 +1,54 @@ +CC=gcc +CFLAGS=-Wall -O2 + +ISADIR = ../misc +YAS=$(ISADIR)/yas +YIS=$(ISADIR)/yis +PIPE=../pipe/psim +SEQ=../seq/ssim +SEQ+ =../seq/ssim+ + +YOFILES = abs-asum-cmov.yo abs-asum-jmp.yo asum.yo asumr.yo asumi.yo cjr.yo j-cc.yo poptest.yo pushquestion.yo pushtest.yo prog1.yo prog2.yo prog3.yo prog4.yo prog5.yo prog6.yo prog7.yo prog8.yo prog9.yo prog10.yo ret-hazard.yo + +PIPEFILES = asum.pipe asumr.pipe cjr.pipe j-cc.pipe poptest.pipe pushquestion.pipe pushtest.pipe prog1.pipe prog2.pipe prog3.pipe prog4.pipe prog5.pipe prog6.pipe prog7.pipe prog8.pipe ret-hazard.pipe + +SEQFILES = asum.seq asumr.seq cjr.seq j-cc.seq poptest.seq pushquestion.seq pushtest.seq prog1.seq prog2.seq prog3.seq prog4.seq prog5.seq prog6.seq prog7.seq prog8.seq ret-hazard.seq + +SEQ+FILES = asum.seq+ asumr.seq+ cjr.seq+ j-cc.seq+ poptest.seq+ pushquestion.seq+ pushtest.seq+ prog1.seq+ prog2.seq+ prog3.seq+ prog4.seq+ prog5.seq+ prog6.seq+ prog7.seq+ prog8.seq+ ret-hazard.seq+ + +.SUFFIXES: +.SUFFIXES: .c .s .o .ys .yo .yis .pipe .seq .seq+ + +all: $(YOFILES) + +test: testpsim testssim testssim+ + +testpsim: $(PIPEFILES) + grep "ISA Check" *.pipe + rm $(PIPEFILES) + +testssim: $(SEQFILES) + grep "ISA Check" *.seq + rm $(SEQFILES) + +testssim+: $(SEQ+FILES) + grep "ISA Check" *.seq+ + rm $(SEQ+FILES) + +.ys.yo: + $(YAS) $*.ys + +.yo.yis: $(YIS) + $(YIS) $*.yo > $*.yis + +.yo.pipe: $(PIPE) + $(PIPE) -t $*.yo > $*.pipe + +.yo.seq: $(SEQ) + $(SEQ) -t $*.yo > $*.seq + +.yo.seq+: $(SEQ+) + $(SEQ+) -t $*.yo > $*.seq+ + +clean: + rm -f *.o *.yis *~ *.yo *.pipe *.seq *.seq+ core diff --git a/arch/sim/y86-code/README b/arch/sim/y86-code/README new file mode 100644 index 0000000..e1f27fe --- /dev/null +++ b/arch/sim/y86-code/README @@ -0,0 +1,20 @@ +This directory contains examples of Y86-64 assembly code programs +(extension `.ys') used in Chapter 4 of CS:APP3e. + +Given an assembly code file "file.ys", you can assemble it with the +command "make file.yo". The resulting file is in the "object code" +format described in the book. + +You can assemble and simulate all the test programs in this directory. +First, you need to make the different simulators in the pipe (psim) +and seq (ssim and ssim+) directories. Then use the following +commands: + +PIPE: make testpsim +SEQ: make testssim +SEQ+: make testssim+ + +Each of these commands will cause a number of programs to be assembled +and simulated. Lots of things will scroll by, but you should see the message +"ISA Check Succeeds" for each of the programs tested. + diff --git a/arch/sim/y86-code/abs-asum-cmov.ys b/arch/sim/y86-code/abs-asum-cmov.ys new file mode 100644 index 0000000..de5ec7f --- /dev/null +++ b/arch/sim/y86-code/abs-asum-cmov.ys @@ -0,0 +1,46 @@ +# Modification of asum code to compute absolute values of entries. +# This version uses a conditional move +# Execution begins at address 0 + .pos 0 + irmovq stack, %rsp # Set up stack pointer + call main # Execute main program + halt # Terminate program + +# Array of 4 elements + .align 8 +array: .quad 0x0000000d000d000d + .quad 0xffffff3fff3fff40 # -0x000000c000c000c0 + .quad 0x00000b000b000b00 + .quad 0xffff5fff5fff6000 # -0x0000a000a000a000 + +main: + irmovq array,%rdi + irmovq $4,%rsi + call absSum # absSum(array, 4) + ret + +# long absSum(long *start, long count) +# start in %rdi, count in %rsi +absSum: + irmovq $8,%r8 # Constant 8 + irmovq $1,%r9 # Constant 1 + xorq %rax,%rax # sum = 0 + andq %rsi,%rsi # Set condition codes + jmp test +/* $begin abs-sum-cmov-ys */ +loop: + mrmovq (%rdi),%r10 # x = *start + xorq %r11,%r11 # Constant 0 + subq %r10,%r11 # -x + cmovg %r11,%r10 # If -x > 0 then x = -x + addq %r10,%rax # Add to sum + addq %r8,%rdi # start++ + subq %r9,%rsi # count-- +test: + jne loop # Stop when 0 +/* $end abs-sum-cmov-ys */ + ret + +# The stack starts here and grows to lower addresses + .pos 0x200 +stack: diff --git a/arch/sim/y86-code/abs-asum-jmp.ys b/arch/sim/y86-code/abs-asum-jmp.ys new file mode 100644 index 0000000..2951bfb --- /dev/null +++ b/arch/sim/y86-code/abs-asum-jmp.ys @@ -0,0 +1,46 @@ +# Modification of asum code to compute absolute values of entries. +# This version uses a conditional jump +# Execution begins at address 0 + .pos 0 + irmovq stack, %rsp # Set up stack pointer + call main # Execute main program + halt # Terminate program + +# Array of 4 elements + .align 8 +array: .quad 0x0000000d000d000d + .quad 0xffffff3fff3fff40 # -0x000000c000c000c0 + .quad 0x00000b000b000b00 + .quad 0xffff5fff5fff6000 # -0x0000a000a000a000 + +main: irmovq array,%rdi + irmovq $4,%rsi + call absSum # absSum(array, 4) + ret +/* $begin abs-sum-jmp-ys */ +# long absSum(long *start, long count) +# start in %rdi, count in %rsi +absSum: + irmovq $8,%r8 # Constant 8 + irmovq $1,%r9 # Constant 1 + xorq %rax,%rax # sum = 0 + andq %rsi,%rsi # Set condition codes + jmp test +loop: + mrmovq (%rdi),%r10 # x = *start + xorq %r11,%r11 # Constant 0 + subq %r10,%r11 # -x + jle pos # Skip if -x <= 0 + rrmovq %r11,%r10 # x = -x +pos: + addq %r10,%rax # Add to sum + addq %r8,%rdi # start++ + subq %r9,%rsi # count-- +test: + jne loop # Stop when 0 + ret +/* $end abs-sum-jmp-ys */ + +# The stack starts here and grows to lower addresses + .pos 0x200 +stack: diff --git a/arch/sim/y86-code/asum.ys b/arch/sim/y86-code/asum.ys new file mode 100644 index 0000000..2c74f34 --- /dev/null +++ b/arch/sim/y86-code/asum.ys @@ -0,0 +1,35 @@ +# Execution begins at address 0 + .pos 0 + irmovq stack, %rsp # Set up stack pointer + call main # Execute main program + halt # Terminate program + +# Array of 4 elements + .align 8 +array: .quad 0x000d000d000d + .quad 0x00c000c000c0 + .quad 0x0b000b000b00 + .quad 0xa000a000a000 + +main: irmovq array,%rdi + irmovq $4,%rsi + call sum # sum(array, 4) + ret + +# long sum(long *start, long count) +# start in %rdi, count in %rsi +sum: irmovq $8,%r8 # Constant 8 + irmovq $1,%r9 # Constant 1 + xorq %rax,%rax # sum = 0 + andq %rsi,%rsi # Set CC + jmp test # Goto test +loop: mrmovq (%rdi),%r10 # Get *start + addq %r10,%rax # Add to sum + addq %r8,%rdi # start++ + subq %r9,%rsi # count--. Set CC +test: jne loop # Stop when 0 + ret # Return + +# Stack starts here and grows to lower addresses + .pos 0x200 +stack: diff --git a/arch/sim/y86-code/asumi.ys b/arch/sim/y86-code/asumi.ys new file mode 100644 index 0000000..5821d06 --- /dev/null +++ b/arch/sim/y86-code/asumi.ys @@ -0,0 +1,38 @@ +# Execution begins at address 0 + .pos 0 + irmovq stack, %rsp # Set up stack pointer + call main # Execute main program + halt # Terminate program + +# Array of 4 elements + .align 8 +array: .quad 0x000d000d000d + .quad 0x00c000c000c0 + .quad 0x0b000b000b00 + .quad 0xa000a000a000 + +main: irmovq array,%rdi + irmovq $4,%rsi + call sum # sum(array, 4) + ret + +/* $begin sumi-ys */ +# long sum(long *start, long count) +# start in %rdi, count in %rsi +sum: + xorq %rax,%rax # sum = 0 + andq %rsi,%rsi # Set condition codes + jmp test +loop: + mrmovq (%rdi),%r10 # Get *start + addq %r10,%rax # Add to sum + iaddq $8,%rdi # start++ + iaddq $-1,%rsi # count-- +test: + jne loop # Stop when 0 + ret +/* $end sumi-ys */ + +# The stack starts here and grows to lower addresses + .pos 0x100 +stack: diff --git a/arch/sim/y86-code/asumr.ys b/arch/sim/y86-code/asumr.ys new file mode 100644 index 0000000..7091271 --- /dev/null +++ b/arch/sim/y86-code/asumr.ys @@ -0,0 +1,42 @@ +# Execution begins at address 0 + .pos 0 + irmovq stack, %rsp # Set up stack pointer + call main # Execute main program + halt # Terminate program + +# Array of 4 elements + .align 8 +array: .quad 0x000d000d000d + .quad 0x00c000c000c0 + .quad 0x0b000b000b00 + .quad 0xa000a000a000 + +main: irmovq array,%rdi + irmovq $4,%rsi + call rsum # rsum(array, 4) + ret + +/* $begin rsum-ys */ +# long rsum(long *start, long count) +# start in %rdi, count in %rsi +rsum: + xorq %rax,%rax # Set return value to 0 + andq %rsi,%rsi # Set condition codes + jle return # If count <= 0, return 0 + pushq %rbx # Save callee-saved register + mrmovq (%rdi),%rbx # Get *start + irmovq $-1,%r10 + addq %r10,%rsi # count-- + irmovq $8,%r10 + addq %r10,%rdi # start++ + call rsum + addq %rbx,%rax # Add *start to sum + popq %rbx # Restore callee-saved register +return: + ret +/* $end rsum-ys */ + +# The stack starts here and grows to lower addresses + .pos 0x200 +stack: + diff --git a/arch/sim/y86-code/cjr.ys b/arch/sim/y86-code/cjr.ys new file mode 100644 index 0000000..a883b16 --- /dev/null +++ b/arch/sim/y86-code/cjr.ys @@ -0,0 +1,17 @@ +# /* $begin cjr-ys */ +# Code to generate a combination of not-taken branch and ret + irmovq Stack, %rsp + irmovq rtnp,%rax + pushq %rax # Set up return pointer + xorq %rax,%rax # Set Z condition code + jne target # Not taken (First part of combination) + irmovq $1,%rax # Should execute this + halt +target: ret # Second part of combination + irmovq $2,%rbx # Should not execute this + halt +rtnp: irmovq $3,%rdx # Should not execute this + halt +.pos 0x40 +Stack: +# /* $end cjr-ys */ diff --git a/arch/sim/y86-code/j-cc.ys b/arch/sim/y86-code/j-cc.ys new file mode 100644 index 0000000..e8a6eb3 --- /dev/null +++ b/arch/sim/y86-code/j-cc.ys @@ -0,0 +1,15 @@ + irmovq $1, %rsi + irmovq $2, %rdi + irmovq $4, %rbp + irmovq $-32, %rax + irmovq $64, %rdx + subq %rdx,%rax + je target + nop + halt +target: + addq %rsi,%rdx + nop + nop + nop + halt diff --git a/arch/sim/y86-code/poptest.ys b/arch/sim/y86-code/poptest.ys new file mode 100644 index 0000000..236880d --- /dev/null +++ b/arch/sim/y86-code/poptest.ys @@ -0,0 +1,6 @@ +# Test of Pop semantics for Y86-64 + irmovq $0x100,%rsp # Initialize stack pointer + irmovq $0xABCD,%rax + pushq %rax # Put known value on stack + popq %rsp # Either get 0xABCD, or 0xfc + halt diff --git a/arch/sim/y86-code/prog1.ys b/arch/sim/y86-code/prog1.ys new file mode 100644 index 0000000..f2f4dc5 --- /dev/null +++ b/arch/sim/y86-code/prog1.ys @@ -0,0 +1,8 @@ +# prog1: Pad with 3 nop's + irmovq $10,%rdx + irmovq $3,%rax + nop + nop + nop + addq %rdx,%rax + halt diff --git a/arch/sim/y86-code/prog10.ys b/arch/sim/y86-code/prog10.ys new file mode 100644 index 0000000..a5dc8c7 --- /dev/null +++ b/arch/sim/y86-code/prog10.ys @@ -0,0 +1,7 @@ +# prog10 + irmovq $1,%rax + xorq %rsp,%rsp # Set stack pointer to 0 and CC to 100 + pushq %rax # Attempt to write to 0xfffffffffffffff8 + addq %rax,%rax # (Should not be executed) Would set CC to 000 + irmovq $2, %rax # Not executed + irmovq $3, %rax # Not executed diff --git a/arch/sim/y86-code/prog2.ys b/arch/sim/y86-code/prog2.ys new file mode 100644 index 0000000..76634f0 --- /dev/null +++ b/arch/sim/y86-code/prog2.ys @@ -0,0 +1,7 @@ +# prog2: Pad with 2 nop's + irmovq $10,%rdx + irmovq $3,%rax + nop + nop + addq %rdx,%rax + halt diff --git a/arch/sim/y86-code/prog3.ys b/arch/sim/y86-code/prog3.ys new file mode 100644 index 0000000..08c9fe1 --- /dev/null +++ b/arch/sim/y86-code/prog3.ys @@ -0,0 +1,6 @@ +# prog3: Pad with 1 nop + irmovq $10,%rdx + irmovq $3,%rax + nop + addq %rdx,%rax + halt diff --git a/arch/sim/y86-code/prog4.ys b/arch/sim/y86-code/prog4.ys new file mode 100644 index 0000000..d9ca4ad --- /dev/null +++ b/arch/sim/y86-code/prog4.ys @@ -0,0 +1,5 @@ +# prog4: No padding + irmovq $10,%rdx + irmovq $3,%rax + addq %rdx,%rax + halt diff --git a/arch/sim/y86-code/prog5.ys b/arch/sim/y86-code/prog5.ys new file mode 100644 index 0000000..3a9193c --- /dev/null +++ b/arch/sim/y86-code/prog5.ys @@ -0,0 +1,8 @@ +# prog5: Load/use hazard + irmovq $128,%rdx + irmovq $3,%rcx + rmmovq %rcx, 0(%rdx) + irmovq $10,%rbx + mrmovq 0(%rdx), %rax # Load %rax + addq %rbx,%rax # Use %rax + halt diff --git a/arch/sim/y86-code/prog6.ys b/arch/sim/y86-code/prog6.ys new file mode 100644 index 0000000..c9db5bb --- /dev/null +++ b/arch/sim/y86-code/prog6.ys @@ -0,0 +1,14 @@ +# Demonstration of return +# /* $begin prog6-ys */ +# prog6 + irmovq stack,%rsp # Initialize stack pointer + call proc # Procedure call + irmovq $10,%rdx # Return point + halt +.pos 0x20 +proc: # proc: + ret # Return immediately + rrmovq %rdx,%rbx # Not executed +.pos 0x30 +stack: # stack: Stack pointer +# /* $end prog6-ys */ diff --git a/arch/sim/y86-code/prog7.ys b/arch/sim/y86-code/prog7.ys new file mode 100644 index 0000000..01702b3 --- /dev/null +++ b/arch/sim/y86-code/prog7.ys @@ -0,0 +1,13 @@ +# Demonstrate branch cancellation +# /* $begin prog7-ys */ +# prog7 + xorq %rax,%rax + jne target # Not taken + irmovq $1, %rax # Fall through + halt +target: + irmovq $2, %rdx # Target + irmovq $3, %rbx # Target+1 +# /* $end prog7-ys */ + halt + diff --git a/arch/sim/y86-code/prog8.ys b/arch/sim/y86-code/prog8.ys new file mode 100644 index 0000000..817518c --- /dev/null +++ b/arch/sim/y86-code/prog8.ys @@ -0,0 +1,5 @@ +# prog8: Forwarding Priority + irmovq $10,%rdx + irmovq $3,%rdx + rrmovq %rdx,%rax + halt diff --git a/arch/sim/y86-code/prog9.ys b/arch/sim/y86-code/prog9.ys new file mode 100644 index 0000000..2dd364f --- /dev/null +++ b/arch/sim/y86-code/prog9.ys @@ -0,0 +1,9 @@ +# Exception handling +# /* $begin prog9-yo */ + xorq %rax,%rax + jne target # Not taken + irmovq $1, %rax # Fall through + halt +target: + .byte 0xFF # Invalid instruction code +# /* $end prog9-yo */ diff --git a/arch/sim/y86-code/pushquestion.ys b/arch/sim/y86-code/pushquestion.ys new file mode 100644 index 0000000..a055632 --- /dev/null +++ b/arch/sim/y86-code/pushquestion.ys @@ -0,0 +1,5 @@ + # Assembly Code to test semantics of pushq + irmovq 0x100, %rsp + pushq %rsp # Ambiguous + popq %rax + halt diff --git a/arch/sim/y86-code/pushtest.ys b/arch/sim/y86-code/pushtest.ys new file mode 100644 index 0000000..bdb5e63 --- /dev/null +++ b/arch/sim/y86-code/pushtest.ys @@ -0,0 +1,7 @@ +# Test of Push semantics for Y86-64 + irmovq $0x100,%rsp # Initialize stack pointer + rrmovq %rsp,%rax # Save stack pointer + pushq %rsp # Push the stack pointer (old or new?) + popq %rdx # Get it back + subq %rdx,%rax # Compute difference. Either 0 (old) or 4 (new). + halt diff --git a/arch/sim/y86-code/ret-hazard.ys b/arch/sim/y86-code/ret-hazard.ys new file mode 100644 index 0000000..51add37 --- /dev/null +++ b/arch/sim/y86-code/ret-hazard.ys @@ -0,0 +1,13 @@ +/* $begin ret-hazard-ys */ +# Test instruction that modifies %esp followed by ret + irmovq mem,%rbx + mrmovq 0(%rbx),%rsp # Sets %rsp to point to return point + ret # Returns to return point + halt # +rtnpt: irmovq $5,%rsi # Return point + halt +.pos 0x40 +mem: .quad stack # Holds desired stack pointer +.pos 0x50 +stack: .quad rtnpt # Top of stack: Holds return point +/* $end ret-hazard-ys */ diff --git a/arch/simguide.pdf b/arch/simguide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..280d15c3b203306398e49d1ae9201f677cd0ca4c GIT binary patch literal 584325 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

9cpzfg9ujb^I&9>=?2>V3$1AOCO< zuD=B7yooi?F+tg&-Eh8gV+z@Vp$T0L{wOfp3qz&ef0ioCJ6oHsoFDjf9jCAkvz=fI zue)kr^X{`BV?_MlS-byobYo)p$Ew4B`hWe03)FA-9e@e^{{szE@i&^`q2nkL?USg~ zA?}fi2V4$;O7-VB0U;ds0`7$f6_0F&4EM{2fr zcSrg-Jd}7Gyxw9f8W@4o3aau+c)I{r=_H7T^c6AeD}CkBWg8f*ZVe!h9RaelPgyha zlgZlziTG8x2*OCGWcSQ*p=fu^Vd%&xt1UxN)B+|@5NwhcG#sQMHGRn_Il+gt1ZLEj|0Ti!nK!>nMIyHhcF}nET%BT*V!~>SE*AW!Otr*7Xu5tb4~@6~ zUh365az-jLV<~#^#P_u7n`@Ao4*UlViU{cp{Z0Z3H~&IT#`x#<*F{OsTn4*=K(YYr zN{)+~2Kz#cw-9iR-1v{gp*->h%84{aOzAWhBSqq&7i!&920E+WXxKI&+AZI3!sDxgZn?$BbOF$ABbh>fU?S*10e78W1v5H%;T9Dk;g0Jg&bMs;6W4u5Jl zKYTD@4iSS`k{+H-gDWG$SQ_8{YLKv8lzG6DbN|e0$ooD*4v=v>q={b9X6Q9L7(4-b z*luYIe*^}9f=^He1TrGni~=&BEq{Kt7ylNcPl6OG7#D*=g8P}+!HBUIno@Kmmdc1- zG33=hLtug^ITmjhZzcqm$TpUq0=_W+xCGB4_>1V8f)5Kwr0_xBkr|!lceGr~X{mY$ z-tTO=rqe$TY3tFwLg9CS#QSROf;qG@xaknlgQN!vw+fmIn~}7^Dtco4F~^}^`;)V3aW(k~CL*e|^v313}70&=9Q$=r}Q0yP4i zdO?I3bN#EM?K15A?7|rY9tB8{G(;Tpuo)v#M8*i{h>|`xA!CPH|HS*sZ=WJUWFB8G zxn4klluSa58s8WPA2$(G84n?mJ;YKAycCNg^o1;Zn0gp>7j$=a_hi>}_j4F@f5Nt8 zXx=3y4CM)hCuK!~WdiWXCzV8tFLy-)3d|+cC5dwo$Kc1p$J|(vCL%XE;{~B+qvnbA zef84ye9NY-SZiT;64}DZvkNnpN7lEVx2~`deGyxO5+*|!mYB{FjuC?qa#Av++@w)R zdgiH$4T|wI&V>sjD8@?0K6~yXK_jRm;)zw1U5dFSDWza#b}C6_%0DvXTk@I8N0goA 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�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