summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabriel Kerneis2014-05-30 15:50:14 +0100
committerGabriel Kerneis2014-05-30 15:50:14 +0100
commit4007e0eb5328b6ed73c045822da09d1aa73faa3c (patch)
treeed880b7ca6a1fc09835e786b9ed2c56d8c7e6e9a /src
parentaaf7f0e51a605e1b107104b6872ee493b4e38a86 (diff)
Remove bit-rotted, abonned test file
Diffstat (limited to 'src')
-rw-r--r--src/test/tiny.sail224
1 files changed, 0 insertions, 224 deletions
diff --git a/src/test/tiny.sail b/src/test/tiny.sail
deleted file mode 100644
index e8ef0805..00000000
--- a/src/test/tiny.sail
+++ /dev/null
@@ -1,224 +0,0 @@
-
-(* is the following typedef equivalent to this?
- typedef regT = bit[7]
-do you want/need something like this instead?
- typedef regT = register bits [0:6] { 0..6: regT }
-*)
-
-typedef regT = bit[0..6]
-typedef wordT = bit[0..31]
-typedef immT = bit[0..23]
-typedef addrT = bit[0..9]
-typedef memT = addrT -> wordT { wmem, rmem }
-
-(* exception Reserved -- no support for exceptions (yet?) *)
-
-(* beware: L3 has "construct", and we have "const struct", but the
- equivalent of "construct" is either "const union" or "enumerate" *)
-
-typedef funcT = enumerate {fADD; fSUB; fINC; fDEC; fAND; fOR; fXOR; fReserved}
-typedef shiftT = enumerate {noShift; RCY1; RCY8; RCY16}
-typedef conditionT = enumerate {skipNever; skipNeg; skipZero; skipInRdy}
-
-(* the previous one will convert to/from integers; safer alternative:
-typedef funcT = const union { unit fADD; ... }
-
-*)
-
-(**** State ****)
-
-addrT PC (* Program Counter *)
-regT -> wordT R (* Registers *)
-memT IM (* Instruction Memory *)
-(* not sure the interpreter will recognize rmem through the typedef *)
-DM :: memT (* Data Memory *)
-InRdy :: bool (* Input Ready *)
-InData :: wordT (* Input Data *)
-OutStrobe :: wordT (* Output Data *)
-
-(****
-
----------------------------------------------
--- Operations
----------------------------------------------
-
-wordT function (func::funcT, a:: wordT, b:: wordT) =
- match func
- {
- case fADD => a + b
- case fSUB => a - b
- case fINC => b + 1
- case fDEC => b - 1
- case fAND => a && b
- case fOR => a || b
- case fXOR => a ?? b
- case _ => #Reserved
- }
-
-wordT shifter (shift::shiftT, a::wordT) =
- match shift
- {
- case noShift => a
- case RCY1 => a #>> 1
- case RCY8 => a #>> 8
- case RCY16 => a #>> 16
- }
-
-wordT ALU (func::funcT, shift::shiftT, a::wordT, b::wordT) =
- shifter (shift, function (func, a, b))
-
-unit incPC (skip::conditionT, alu::wordT) =
- match skip
- {
- case skipNever => PC <- PC + 1
- case skipNeg => PC <- PC + if alu < 0 then 2 else 1
- case skipZero => PC <- PC + if alu == 0 then 2 else 1
- case skipInRdy => PC <- PC + if InRdy then 2 else 1
- }
-
--- Common functionality
-unit norm (func::funcT, shift::shiftT, skip::conditionT,
- wback::bool, strobe::bool, w::regT, a::regT, b::regT) =
-{
- alu = ALU (func, shift, R(a), R(b));
- when wback do R(w) <- alu;
- when strobe do OutStrobe <- alu;
- incPC (skip, alu)
-}
-
----------------------------------------------
--- Instructions
----------------------------------------------
-
-define Normal (func::funcT, shift::shiftT, skip::conditionT,
- w::regT, a::regT, b::regT) =
- norm (func, shift, skip, true, false, w, a, b)
-
-
-define StoreDM (func::funcT, shift::shiftT, skip::conditionT,
- w::regT, a::regT, b::regT) =
-{
- DM([R(b)]) <- R(a);
- norm (func, shift, skip, true, false, w, a, b)
-}
-
-define StoreIM (func::funcT, shift::shiftT, skip::conditionT,
- w::regT, a::regT, b::regT) =
-{
- IM([R(b)]) <- R(a);
- norm (func, shift, skip, true, false, w, a, b)
-}
-
-define Out (func::funcT, shift::shiftT, skip::conditionT,
- w::regT, a::regT, b::regT) =
- norm (func, shift, skip, true, true, w, a, b)
-
-define LoadDM (func::funcT, shift::shiftT, skip::conditionT,
- w::regT, a::regT, b::regT) =
-{
- R(w) <- DM([R(b)]);
- norm (func, shift, skip, false, false, w, a, b)
-}
-
-define In (func::funcT, shift::shiftT, skip::conditionT,
- w::regT, a::regT, b::regT) =
-{
- R(w) <- InData;
- norm (func, shift, skip, false, false, w, a, b)
-}
-
-define Jump (func::funcT, shift::shiftT, w::regT, a::regT, b::regT) =
-{
- R(w) <- ZeroExtend (PC + 1);
- PC <- [ALU (func, shift, R(a), R(b))]
-}
-
-define LoadConstant (w::regT, imm::immT) =
-{
- R(w) <- ZeroExtend (imm);
- PC <- PC + 1
-}
-
-define ReservedInstr = #Reserved
-
-define Run
-
----------------------------------------------
--- Decode
----------------------------------------------
-
-instruction Decode (opc::wordT) =
- match opc
- {
- case 'Rw 1 imm`24' => LoadConstant (Rw, imm)
- case 'Rw 0 Ra Rb Function Shift Skip Op' =>
- {
- func = [Function :: bits(3)] :: funcT;
- shift = [Shift :: bits(2)] :: shiftT;
- skip = [Skip :: bits(2)] :: conditionT;
- match Op
- {
- case 0 => Normal (func, shift, skip, Rw, Ra, Rb)
- case 1 => StoreDM (func, shift, skip, Rw, Ra, Rb)
- case 2 => StoreIM (func, shift, skip, Rw, Ra, Rb)
- case 3 => Out (func, shift, skip, Rw, Ra, Rb)
- case 4 => LoadDM (func, shift, skip, Rw, Ra, Rb)
- case 5 => In (func, shift, skip, Rw, Ra, Rb)
- case 6 => Jump (func, shift, Rw, Ra, Rb)
- case 7 => ReservedInstr
- }
- }
- }
-
----------------------------------------------
--- Next State
----------------------------------------------
-
-unit Next =
-{
- i = Decode (IM (PC));
- when i <> ReservedInstr do Run (i)
-}
-
----------------------------------------------
--- Encode
----------------------------------------------
-
-wordT enc
- (args::funcT * shiftT * conditionT * regT * regT * regT, opc::bits(3)) =
-{
- func, shift, skip, w, a, b = args;
- return (w : '0' : a : b : [func]`3 : [shift]`2 : [skip]`2 : opc)
-}
-
-wordT Encode (i::instruction) =
- match i
- {
- case LoadConstant (Rw, imm) => Rw : '1' : imm
- case Normal (args) => enc (args, '000')
- case StoreDM (args) => enc (args, '001')
- case StoreIM (args) => enc (args, '010')
- case Out (args) => enc (args, '011')
- case LoadDM (args) => enc (args, '100')
- case In (args) => enc (args, '101')
- case Jump (func, shift, Rw, Ra, Rb) =>
- enc ((func, shift, skipNever, Rw, Ra, Rb), '110')
- case ReservedInstr => 0b111
- }
-
----------------------------------------------
--- Load into Instruction Memory
----------------------------------------------
-
-unit LoadIM (a::addrT, i::instruction list) measure Length (i) =
- match i
- {
- case Nil => nothing
- case Cons (h, t) =>
- {
- IM(a) <- Encode (h);
- LoadIM (a + 1, t)
- }
- }
-
-*****)