def sext( value, nbits ): value = trim( value, nbits ) sign_mask = 0x1 << (nbits - 1) mask = trim_64( r_ulonglong( 0xffffffffffffff ) << nbits ) if value & sign_mask: return mask | value return value
def sext(value, nbits): value = trim(value, nbits) sign_mask = 0x1 << (nbits - 1) mask = trim_64(r_ulonglong(0xffffffffffffff) << nbits) if value & sign_mask: return mask | value return value
def sext_32(value): value = r_ulonglong(value) value = 0x00000000ffffffff & value if value & 0x80000000: return r_ulonglong(0xffffffff00000000) | value return value
def trim_64(value): value = r_ulonglong(value) return value & r_ulonglong(0xffffffffffffffff)
def trim(value, nbits): value = r_ulonglong(value) mask = r_ulonglong(0xffffffffffffffff) >> (64 - nbits) return value & mask
def __init__( self, memory, debug, reset_addr=0x400, xlen=64, flen=64, extensions="imafd" ): self.pc = reset_addr self.xlen = xlen # defines the bitwidth of int registers self.flen = flen # defines the bitwidth of fp registers # TODO: convert to lower self.extensions = extensions self.rf = RiscVRegisterFile( nbits=self.xlen ) self.csr = Csr( self ) # TODO: a bit hacky... if self.extension_enabled( "f" ): self.fp = RiscVFPRegisterFile() self.fp.debug = debug self.fcsr = r_ulonglong( 0 ) # Bits( 32 ) self.mem = memory if self.extension_enabled( "a" ): self.load_reservation = 0 # Bits( 64 ) self .debug = debug self.rf .debug = debug self.mem.debug = debug # other state self.prv = PRV_M self.mepc = 0 self.mbadaddr = 0 self.mtimecmp = 0 self.mscratch = 0 self.mcause = 0 self.minstret = 0 self.mie = 0 self.mip = 0 self.sepc = 0 self.sbadaddr = 0 self.sscratch = 0 self.stvec = 0 self.sptbr = 0 self.scause = 0 self.sutime_delta = 0 self.suinstret_delta = 0 self.tohost = 0 self.fromhost = 0 # coprocessor registers self.status = 0 self.stats_en = 0 self.num_insts = 0 self.stat_num_insts = 0 # we need a dedicated running flag bacase status could be 0 on a # syscall_exit self.running = True # indicate if this is running a self-checking test self.testbin = False # executable name self.exe_name = "" # syscall stuff... TODO: should this be here? self.breakpoint = 0
def execute_fsflags( s, inst ): old = s.fcsr & 0x1F new = s.rf[inst.rs1] & 0x1F s.fcsr = r_ulonglong((s.fcsr >> 5) << 5) | new s.rf[inst.rd] = old s.pc += 4
def x(self, lo, len): mask = r_ulonglong(0xffffffffffffffff) >> (64 - len) return (self.bits >> lo) & mask
def execute_fsgnjx_d( s, inst ): sign_mask = r_ulonglong( 1 << 63 ) body_mask = sign_mask - 1 a, b = s.fp[inst.rs1], s.fp[inst.rs2] s.fp[inst.rd] = (b & sign_mask) ^ a s.pc += 4
def execute_fsflags(s, inst): old = s.fcsr & 0x1F new = s.rf[inst.rs1] & 0x1F s.fcsr = r_ulonglong((s.fcsr >> 5) << 5) | new s.rf[inst.rd] = old s.pc += 4
def fp_neg( value, nbits ): sign_mask = r_ulonglong( 1 << (nbits - 1) ) return sign_mask ^ value
def sext_32( value ): value = r_ulonglong( value ) value = 0x00000000ffffffff & value if value & 0x80000000: return r_ulonglong( 0xffffffff00000000 ) | value return value
def trim_64( value ): value = r_ulonglong( value ) return value & r_ulonglong( 0xffffffffffffffff )
def trim( value, nbits ): value = r_ulonglong( value ) mask = r_ulonglong( 0xffffffffffffffff ) >> (64 - nbits) return value & mask
def x(self, lo, len): mask = r_ulonglong(0xFFFFFFFFFFFFFFFF) >> (64 - len) return (self.bits >> lo) & mask
def fp_neg(value, nbits): sign_mask = r_ulonglong(1 << (nbits - 1)) return sign_mask ^ value
def __init__(self, memory, debug, reset_addr=0x400, xlen=64, flen=64, extensions="imafd"): self.pc = reset_addr self.xlen = xlen # defines the bitwidth of int registers self.flen = flen # defines the bitwidth of fp registers # TODO: convert to lower self.extensions = extensions self.rf = RiscVRegisterFile(nbits=self.xlen) self.csr = Csr(self) # TODO: a bit hacky... if self.extension_enabled("f"): self.fp = RiscVFPRegisterFile() self.fp.debug = debug self.fcsr = r_ulonglong(0) # Bits( 32 ) self.mem = memory if self.extension_enabled("a"): self.load_reservation = 0 # Bits( 64 ) self.debug = debug self.rf.debug = debug self.mem.debug = debug # other state self.prv = PRV_M self.mepc = 0 self.mbadaddr = 0 self.mtimecmp = 0 self.mscratch = 0 self.mcause = 0 self.minstret = 0 self.mie = 0 self.mip = 0 self.sepc = 0 self.sbadaddr = 0 self.sscratch = 0 self.stvec = 0 self.sptbr = 0 self.scause = 0 self.sutime_delta = 0 self.suinstret_delta = 0 self.tohost = 0 self.fromhost = 0 # coprocessor registers self.status = 0 self.stats_en = 0 self.num_insts = 0 self.stat_num_insts = 0 # we need a dedicated running flag bacase status could be 0 on a # syscall_exit self.running = True # indicate if this is running a self-checking test self.testbin = False # executable name self.exe_name = "" # syscall stuff... TODO: should this be here? self.breakpoint = 0