boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

common.py (1657B)


      1 from collections import namedtuple
      2 
      3 
      4 ArchDef = namedtuple(
      5     'ArchDef',
      6     'name word_bytes stack_align syscall_numbers encoders start_stub',
      7 )
      8 
      9 Banner = namedtuple('Banner', 'text')
     10 Literal = namedtuple('Literal', 'name hex_by_arch')
     11 Nullary = namedtuple('Nullary', 'name kind')
     12 Li = namedtuple('Li', 'name rd')
     13 La = namedtuple('La', 'name rd')
     14 LaBr = namedtuple('LaBr', 'name')
     15 Mov = namedtuple('Mov', 'name rd rs')
     16 Rrr = namedtuple('Rrr', 'name op rd ra rb')
     17 AddI = namedtuple('AddI', 'name rd ra imm')
     18 LogI = namedtuple('LogI', 'name op rd ra imm')
     19 ShiftI = namedtuple('ShiftI', 'name op rd ra imm')
     20 Mem = namedtuple('Mem', 'name op rt rn off')
     21 LdArg = namedtuple('LdArg', 'name rd slot')
     22 BranchReg = namedtuple('BranchReg', 'name kind rs')
     23 CondB = namedtuple('CondB', 'name op ra rb')
     24 CondBZ = namedtuple('CondBZ', 'name op ra')
     25 Enter = namedtuple('Enter', 'name size')
     26 
     27 
     28 ARCH_REGISTRY = {}
     29 
     30 
     31 def register_arch(arch):
     32     if arch.name in ARCH_REGISTRY:
     33         raise RuntimeError(f'duplicate arch registration: {arch.name}')
     34     ARCH_REGISTRY[arch.name] = arch
     35 
     36 
     37 def get_arch(name):
     38     return ARCH_REGISTRY[name]
     39 
     40 
     41 def registered_arches():
     42     return tuple(sorted(ARCH_REGISTRY))
     43 
     44 
     45 def byte(n):
     46     return f'{n & 0xFF:02X}'
     47 
     48 
     49 def le32(n):
     50     return (n & 0xFFFFFFFF).to_bytes(4, 'little').hex().upper()
     51 
     52 
     53 def le64(n):
     54     return (n & 0xFFFFFFFFFFFFFFFF).to_bytes(8, 'little').hex().upper()
     55 
     56 
     57 def word_hex(word_bytes, n):
     58     if word_bytes == 4:
     59         return le32(n)
     60     if word_bytes == 8:
     61         return le64(n)
     62     raise ValueError(f'unsupported word size: {word_bytes}')
     63 
     64 
     65 def round_up(align, n):
     66     return ((n + align - 1) // align) * align