Skip to content

Commit c77a680

Browse files
committed
Read operands from string
This allows construction of simple assembler programs.
1 parent 24fc3a7 commit c77a680

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

riscvmodel/isa.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ class Instruction(metaclass=ABCMeta):
2929
_funct7 = None
3030
_funct12 = None
3131

32+
def ops_from_string(self, ops: str):
33+
"""
34+
Extract operands from string
35+
"""
36+
3237
def randomize(self, variant: Variant):
3338
"""
3439
Randomize this instruction
@@ -112,6 +117,9 @@ def __init__(self, rd: int = None, rs1: int = None, rs2: int = None):
112117
self.rs1 = rs1
113118
self.rs2 = rs2
114119

120+
def ops_from_string(self, ops):
121+
(self.rd, self.rs1, self.rs2) = [int(op[1:]) for op in ops.split(",")]
122+
115123
def randomize(self, variant: Variant):
116124
self.rd = randrange(0, variant.xlen)
117125
self.rs1 = randrange(0, variant.xlen)
@@ -172,6 +180,13 @@ def __init__(self, rd: int = None, rs1: int = None, imm: int = None):
172180
if imm is not None:
173181
self.imm.set(imm)
174182

183+
def ops_from_string(self, ops):
184+
ops = [op for op in ops.split(",")]
185+
self.rd = int(ops[0][1:])
186+
self.rs1 = int(ops[1][1:])
187+
self.imm.set(int(ops[2]))
188+
189+
175190
def randomize(self, variant: Variant):
176191
self.rd = randrange(0, variant.xlen)
177192
self.rs1 = randrange(0, variant.xlen)
@@ -240,6 +255,12 @@ def __init__(self, rd: int = None, rs1: int = None, shamt: int = None):
240255
self.rs1 = rs1
241256
self.shamt = Immediate(bits=5)
242257

258+
def ops_from_string(self, ops):
259+
ops = [op for op in ops.split(",")]
260+
self.rd = int(ops[0][1:])
261+
self.rs1 = int(ops[1][1:])
262+
self.shamt.set(int(ops[2]))
263+
243264
def decode(self, machinecode: int):
244265
self.rd = (machinecode >> 7) & 0x1F
245266
self.rs1 = (machinecode >> 15) & 0x1F
@@ -290,6 +311,12 @@ def __init__(self, rs1: int = None, rs2: int = None, imm: int = None):
290311
if imm is not None:
291312
self.imm.set(imm)
292313

314+
def ops_from_string(self, ops):
315+
ops = [op for op in ops.split(",")]
316+
self.rs1 = int(ops[0][1:])
317+
self.rs2 = int(ops[1][ops[1].find("(")+2:-1])
318+
self.imm.set(int(ops[1][0:ops[1].find("(")]))
319+
293320
def randomize(self, variant: Variant):
294321
self.rs1 = randrange(0, variant.xlen)
295322
self.rs2 = randrange(0, variant.xlen)
@@ -348,6 +375,12 @@ def __init__(self, rs1: int = None, rs2: int = None, imm: int = None):
348375
if imm is not None:
349376
self.imm.set(imm)
350377

378+
def ops_from_string(self, ops):
379+
ops = [op for op in ops.split(",")]
380+
self.rs1 = int(ops[0][1:])
381+
self.rs2 = int(ops[1][1:])
382+
self.imm.set(int(ops[2]))
383+
351384
def randomize(self, variant: Variant):
352385
self.rs1 = randrange(0, variant.xlen)
353386
self.rs2 = randrange(0, variant.xlen)
@@ -406,6 +439,11 @@ def __init__(self, rd: int = None, imm: int = None):
406439
if imm is not None:
407440
self.imm.set(imm)
408441

442+
def ops_from_string(self, ops):
443+
ops = [op for op in ops.split(",")]
444+
self.rs1 = int(ops[0][1:])
445+
self.imm.set(int(ops[1]))
446+
409447
def randomize(self, variant: Variant):
410448
self.rd = randrange(0, variant.xlen)
411449
self.imm.randomize()

0 commit comments

Comments
 (0)