添加虚拟cpu
This commit is contained in:
36
cpu.py
Normal file
36
cpu.py
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def get_value(b:bytearray):
|
||||
ret=0
|
||||
for i,item in enumerate(b):
|
||||
ret|=item<<(8*i)
|
||||
return ret
|
||||
|
||||
def set_value(b:bytearray,value:int):
|
||||
for i in range(len(b)):
|
||||
b[i]=(value>>(8*i))&0xff
|
||||
|
||||
|
||||
class cpu(object):
|
||||
def __init__(self,rom_addr:int,rom_size:int,mem_addr:int,mem_size:int) -> None:
|
||||
self.rom_addr=rom_addr
|
||||
self.rom=bytearray(rom_size)
|
||||
self.mem_addr=mem_addr
|
||||
self.mem=bytearray(mem_size)
|
||||
def get_value(self,addr:int,size:int):
|
||||
if not (size in [1,2,4,8]):
|
||||
raise Exception(f"CPU 异常 因为地址未对齐 {size}")
|
||||
if(addr>=self.rom_addr) and (addr<self.rom_addr+len(self.rom)):
|
||||
return get_value(self.rom[addr-self.rom_addr,addr-self.rom_addr+size])
|
||||
def set_value(self,addr:int,size:int,value:int):
|
||||
if not (size in [1,2,4,8]):
|
||||
raise Exception(f"CPU 异常 因为地址未对齐 {size}")
|
||||
if(addr>=self.rom_addr) and (addr<self.rom_addr+len(self.rom)):
|
||||
set_value(self.rom[addr-self.rom_addr,addr-self.rom_addr+size],value)
|
||||
|
||||
|
||||
|
||||
|
93
node_run.py
93
node_run.py
@@ -1,6 +1,6 @@
|
||||
from copy import deepcopy
|
||||
|
||||
|
||||
from cpu import cpu
|
||||
from io import StringIO as string
|
||||
|
||||
|
||||
|
||||
@@ -46,13 +46,13 @@ class variable_type(object):
|
||||
if("struct" in self.attr):
|
||||
size=0
|
||||
for item in self.member:
|
||||
item_size=((item.get_size()+(self.pack-1))//self.pack)*self.pack
|
||||
item_size=((item[0].get_size()+(self.pack-1))//self.pack)*self.pack
|
||||
size+=item_size
|
||||
return size
|
||||
elif("union" in self.attr):
|
||||
size=0
|
||||
for item in self.member:
|
||||
item_size=item.get_size()
|
||||
item_size=item[0].get_size()
|
||||
if(size<item_size):
|
||||
size=item_size
|
||||
return size
|
||||
@@ -62,18 +62,39 @@ class variable_type(object):
|
||||
return self.size
|
||||
|
||||
class variable(object):
|
||||
def __init__(self,name:str,attr:variable_type,value=None):
|
||||
def __init__(self,name:str,attr:variable_type,value:int):
|
||||
self.name=name
|
||||
self.value_=value
|
||||
self.value_=value # 这个值是变量在内存中的首地址
|
||||
self.attr=attr
|
||||
def set_value(self,value):
|
||||
if("const" in self.attr):
|
||||
raise Exception(f"变量 {self.name} 不可写")
|
||||
self.value_=value
|
||||
def size(self):
|
||||
return self.attr.get_size()
|
||||
def value(self):
|
||||
return self.value_
|
||||
def member_value(self,member_stack:list[str]):
|
||||
return self.value_
|
||||
return self.value_,self.attr.get_size()
|
||||
def member_value(self,member_stack:list[str]=[]):
|
||||
off=0
|
||||
deep=len(member_stack)
|
||||
member=self.attr.member
|
||||
index=0
|
||||
member_index=0
|
||||
member_len=len(member)
|
||||
while index < deep:
|
||||
while(member_index < member_len):
|
||||
if(member[member_index][1]!=member_stack[index]):
|
||||
off+=member[member_index][0].get_size()
|
||||
member_index+=1
|
||||
else:
|
||||
index+=1
|
||||
if(index==deep):
|
||||
return self.value_+off,member[member_index][0].get_size()
|
||||
member=member[member_index][0].member
|
||||
member_index=0
|
||||
member_len=len(member)
|
||||
raise Exception(f"{self.name} 中不存在指定成员 {member_stack}")
|
||||
return self.value()
|
||||
|
||||
|
||||
class variable_alias(object):
|
||||
@@ -83,7 +104,6 @@ class variable_alias(object):
|
||||
|
||||
class file(object):
|
||||
def __init__(self):
|
||||
self.stack:list[variable]=[]
|
||||
self.variable_type_list:list[variable_type]=[
|
||||
variable_type(["char"],1,(-128,127)),
|
||||
variable_type(["short"],2,(-32768,32767)),
|
||||
@@ -114,6 +134,9 @@ class file(object):
|
||||
self.unname_struct_index=0
|
||||
self.unname_union_index=0
|
||||
self.unname_enum_index=0
|
||||
self.cpu=cpu(0x1000_0000,1*1024*1024,0x2000_0000,1*1024*1024)
|
||||
self.cpu_mem_ptr=0x2000_0000
|
||||
self.stack:list[variable]=[]
|
||||
def variable_type_check(self,attr:list[str]):
|
||||
for item in self.variable_type_list:
|
||||
if(item.eq(attr)):
|
||||
@@ -190,33 +213,55 @@ class file(object):
|
||||
if(len(attr)==1):
|
||||
for item in self.variable_type_alias:
|
||||
if(item.alias==attr[0]):
|
||||
self.stack.append(variable(name,item.attr,value))
|
||||
self.stack.append(variable(name,item.attr,self.cpu_mem_ptr))
|
||||
self.cpu_mem_ptr+=item.attr.get_size()
|
||||
return
|
||||
for item in self.variable_type_list:
|
||||
if(item.eq(attr)):
|
||||
self.stack.append(variable(name,item,value))
|
||||
self.stack.append(variable(name,item,self.cpu_mem_ptr))
|
||||
self.cpu_mem_ptr+=item.get_size()
|
||||
def modify_variable(self,name:str,value):
|
||||
for item in self.stack:
|
||||
if(item.name==name):
|
||||
item.set_value(value)
|
||||
addr,size=item.value()
|
||||
cpu.set_value(addr,size,value)
|
||||
return
|
||||
raise Exception(f"符号名称不存在 {name}")
|
||||
def __str__(self) -> str:
|
||||
print("变量类型")
|
||||
for item in self.variable_type_list:
|
||||
print(f"\t{item.attr}")
|
||||
print("变量别名")
|
||||
for item in self.variable_type_alias:
|
||||
print(f"\t{item.attr.attr} eq {item.alias}")
|
||||
print("变量栈")
|
||||
def get_variable(self,name:str,member_stack:list[str]=[]):
|
||||
for item in self.stack:
|
||||
print(f"\t{item.attr.attr} {item.name}={item.value()}")
|
||||
return ""
|
||||
if(item.name==name):
|
||||
addr,size=item.member_value(member_stack)
|
||||
print(f"addr={addr},size={size}")
|
||||
return
|
||||
|
||||
def __str__(self) -> str:
|
||||
ret=string()
|
||||
ret.write("变量类型\n")
|
||||
for item in self.variable_type_list:
|
||||
ret.write(f"\t{item.attr}\n")
|
||||
ret.write("变量别名\n")
|
||||
for item in self.variable_type_alias:
|
||||
ret.write(f"\t{item.attr.attr} eq {item.alias}\n")
|
||||
ret.write("变量栈\n")
|
||||
for item in self.stack:
|
||||
addr,size=item.value()
|
||||
ret.write(f"\t{item.attr.attr} {item.name}={hex(addr)},{size}\n")
|
||||
ret_str=ret.getvalue()
|
||||
ret.close()
|
||||
return ret_str
|
||||
|
||||
if __name__ == "__main__":
|
||||
f=file()
|
||||
f.add_enum_type("enum1",[("ENUM0",0),("ENUM1",1)])
|
||||
f.add_struct_type(4,"struct1",[(f.get_variable_type(['int']),'a')])
|
||||
f.add_struct_type(4,"struct1",[
|
||||
(f.get_variable_type(['int']),'a'),
|
||||
(f.get_variable_type(['int']),'b'),
|
||||
])
|
||||
f.add_type_alias(['unsigned','char'],'uint8_t')
|
||||
f.add_variable(['unsigned','char'],'char_a',120)
|
||||
f.add_variable(['uint8_t'],'char_b',100)
|
||||
f.add_variable(['struct',"struct1"],'struct_a')
|
||||
f.get_variable("struct_a")
|
||||
f.get_variable("struct_a",['a'])
|
||||
f.get_variable("struct_a",['b'])
|
||||
print(f)
|
Reference in New Issue
Block a user