110 lines
2.9 KiB
Python
110 lines
2.9 KiB
Python
import re
|
|
import sys
|
|
import inspect
|
|
import enum as Enum
|
|
|
|
def find_variable_name(value):
|
|
frame = inspect.currentframe()
|
|
try:
|
|
for var_name, var_value in frame.f_back.f_locals.items():
|
|
if var_value is value:
|
|
return var_name
|
|
finally:
|
|
del frame
|
|
|
|
|
|
def dict_or_object_get_attr(dict_or_object, name, default_attr) :
|
|
if dict_or_object == None or name == None:
|
|
return default_attr
|
|
|
|
if type(dict_or_object) == dict :
|
|
if name in dict_or_object.keys():
|
|
return dict_or_object[name]
|
|
return default_attr
|
|
|
|
return getattr(dict_or_object, name, default_attr)
|
|
|
|
def value_u64_to_s64(value) :
|
|
svalue = value
|
|
if (svalue >> 63) & 0x1 :
|
|
svalue = -((svalue ^ 0xFFFFFFFFFFFFFFFF) + 1)
|
|
return svalue
|
|
|
|
def value_u32_to_s32(value) :
|
|
svalue = value
|
|
if (svalue & 0x80000000) :
|
|
svalue = -((svalue ^ 0xFFFFFFFF) + 1)
|
|
return svalue
|
|
|
|
def value_u16_to_s16(value) :
|
|
svalue = value
|
|
if (svalue & 0x8000) :
|
|
svalue = -((svalue ^ 0xFFFF) + 1)
|
|
return svalue
|
|
|
|
'''
|
|
正则表达式
|
|
^:匹配字符串开头。
|
|
$:匹配字符串结尾。
|
|
.:匹配任意字符。
|
|
*:匹配前面的字符零次或多次。
|
|
+:匹配前面的字符一次或多次。
|
|
?:匹配前面的字符零次或一次。
|
|
[]:匹配括号中列举的任意一个字符。
|
|
[^]:匹配除了括号中列举的字符以外的任意一个字符。
|
|
():标记一个子表达式的开始和结束位置。
|
|
\s: 包含空格
|
|
\S: 不包含空格
|
|
\d: 包含数字
|
|
\D: 不包含数字
|
|
'''
|
|
def comm_str_unpack(comm_str) :
|
|
pattern_bit_regs = "(\d+)\.(\d+)((\s*)#(\s*)(\d+))*"
|
|
pattern_regs = "(\d+)((\s*)#(\s*)(\d+))*"
|
|
|
|
reg_addr = 0
|
|
reg_count = 0
|
|
bit = -1
|
|
|
|
bit_reg_result = None
|
|
reg_result = None
|
|
|
|
if comm_str == None :
|
|
return reg_addr, bit, reg_count
|
|
|
|
#[8000.2 # 3] or [8000.2]
|
|
bit_reg_result = re.search(pattern_bit_regs, comm_str)
|
|
if bit_reg_result :
|
|
match_str = bit_reg_result.string
|
|
bit_result_value = re.findall('\d+', match_str)
|
|
item_count = len(bit_result_value)
|
|
|
|
if item_count >= 2 :
|
|
reg_addr = int(bit_result_value[0])
|
|
bit = int(bit_result_value[1])
|
|
if item_count == 3:
|
|
reg_count = int(bit_result_value[2])
|
|
else :
|
|
reg_count = 1
|
|
|
|
#[8000 # 2] or [8000]
|
|
reg_result = None
|
|
if bit_reg_result == None:
|
|
reg_result = re.search(pattern_regs, comm_str)
|
|
|
|
if reg_result != None:
|
|
match_str = reg_result.string
|
|
reg_result_value = re.findall('\d+', match_str)
|
|
item = len(reg_result_value)
|
|
|
|
if item >= 1 :
|
|
reg_addr = int(reg_result_value[0])
|
|
|
|
if item == 2 :
|
|
reg_count = int(reg_result_value[1])
|
|
else :
|
|
reg_count = 1
|
|
|
|
return reg_addr, bit, reg_count
|
|
|