Пример #1
0
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
Пример #2
0
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
Пример #3
0
def sext_32(value):
    value = r_ulonglong(value)
    value = 0x00000000ffffffff & value
    if value & 0x80000000:
        return r_ulonglong(0xffffffff00000000) | value
    return value
Пример #4
0
def trim_64(value):
    value = r_ulonglong(value)
    return value & r_ulonglong(0xffffffffffffffff)
Пример #5
0
def trim(value, nbits):
    value = r_ulonglong(value)
    mask = r_ulonglong(0xffffffffffffffff) >> (64 - nbits)
    return value & mask
Пример #6
0
  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
Пример #7
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
Пример #8
0
 def x(self, lo, len):
     mask = r_ulonglong(0xffffffffffffffff) >> (64 - len)
     return (self.bits >> lo) & mask
Пример #9
0
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
Пример #10
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
Пример #11
0
def fp_neg( value, nbits ):
  sign_mask = r_ulonglong( 1 << (nbits - 1) )
  return sign_mask ^ value
Пример #12
0
def sext_32( value ):
  value = r_ulonglong( value )
  value = 0x00000000ffffffff & value
  if value & 0x80000000:
    return r_ulonglong( 0xffffffff00000000 ) | value
  return value
Пример #13
0
def trim_64( value ):
  value = r_ulonglong( value )
  return value & r_ulonglong( 0xffffffffffffffff )
Пример #14
0
def trim( value, nbits ):
  value = r_ulonglong( value )
  mask = r_ulonglong( 0xffffffffffffffff ) >> (64 - nbits)
  return value & mask
Пример #15
0
 def x(self, lo, len):
     mask = r_ulonglong(0xFFFFFFFFFFFFFFFF) >> (64 - len)
     return (self.bits >> lo) & mask
Пример #16
0
def fp_neg(value, nbits):
    sign_mask = r_ulonglong(1 << (nbits - 1))
    return sign_mask ^ value
Пример #17
0
    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