Open mchwang233 opened 1 year ago
#!/bin/python3
# -*-coding :utf-8 -*-
#========================================================================
# File : comm.py
# Author : Gavin
# Email : wmchappy@outlook.com
# Data : 2023-04-20\uff0cCreated
#
# Description :
#
# Details :
#
#=======================================================================
import sys
help_info = """
\033[36m====================================================================================================================\033[0m
\033[34mHELP INFOMATION \033[0m
\033[36m====================================================================================================================\033[0m
\033[34mDEFAULT MODE \033[0m
\033[36m--------------------------------------------------------------------------------------------------------------------\033[0m
\033[34mIllustration:This mode is used in situations where projects generally \033[0m
\033[34mrequire generatingmodules of dummy files or generating multiple modules; \033[0m
\033[36m--------------------------------------------------------------------------------------------------------------------\033[0m
\033[34mConfiguration Item : \033[0m
\033[32m 1.-dbdir= : specify DB(must specify) eg: -dbdir=/proj/sim/simv.daidir \033[0m
\033[32m 2.-wave= : specify wave(must specify) eg: -wave=/proj/sim/wave.fsdb \033[0m
\033[32m 3.-delay_time= : the number of time after event trigered eg: -delay_time=1000 \033[0m
\033[32m 4.-start_time= : the number of time before start wait event eg: -start_time=5000 \033[0m
\033[32m 5.-event= : the event eg: -event=tb_top.dut.a=1 \033[0m
\033[32m 6.-dummy_dir= : the diretory eg: -dummy_dir=dummy \033[0m
\033[32m 7.+hier= : add the module's hierarchy eg: +hier=tb_top.dut.add +hier=tb_top.dut.kk.* \033[0m
\033[36m--------------------------------------------------------------------------------------------------------------------\033[0m
\033[34mUsage: \033[0m
\033[34mFirstly you can use this command to add configuration like: \033[0m
\033[32m DummyGen -config -dbdir=/proj/sim/simv.dadir \\ \033[0m
\033[32m -wave=/proj/sim/wave.fsdb \\ \033[0m
\033[32m -event=tb_top.dut.a=1 \\ \033[0m
\033[32m -start_time=50000 \\ \033[0m
\033[32m -delay_time=10000 \\ \033[0m
\033[32m -dummy_dir=dummy \\ \033[0m
\033[32m +hier=tb_top.dut.add +hier=tb_top.dut.kk.* \033[0m
\033[34mor like this: \033[0m
\033[32m DummyGen -config -dbdir=/proj/sim/simv.dadir \033[0m
\033[32m DummyGen -config -wave=/proj/sim/wave.fsdb \033[0m
\033[32m DummyGen -config -event=tb_top.dut.a=1 \033[0m
\033[32m DummyGen -config -start_time=50000 \033[0m
\033[32m DummyGen -config -delay_time=10000 \033[0m
\033[32m DummyGen -config -dummy_dir=dummy \033[0m
\033[32m DummyGen -config +hier=tb_top.dut.add +hier=tb_top.dut.kk.* \033[0m
\033[34mthan you can generate the dummy files use this command: \033[0m
\033[32m DummyGen -default \033[0m
\033[34m***important message*** \033[0m
\033[34m 1.These configration only need add once time if you don't have new requirements \033[0m
\033[34m 2.This mode can configurate multiple hierarchise, the hierarchise information will be coverd in next config \033[0m
\033[34m command which with +hier= ,so that multiple hierarchise must in on line command like : \033[0m
\033[34m DummyGen -config +hier=tb_top.dut.add +hier=tb_top.dut.kk, this command will add two hierarchise to \033[0m
\033[34m configrations and cover last time hierarchise configrations \033[0m
\033[34m 3.if you want to clean configrations,you can use this command: DummyGen -clear , however, this command will \033[0m
\033[34m not clean hierarchise configrations \033[0m
\033[34m 4.if you want to know all configrations, you can use that: DummyGen -config \033[0m
\033[36m====================================================================================================================\033[0m
\033[34mFREEDOM MODE \033[0m
\033[36m--------------------------------------------------------------------------------------------------------------------\033[0m
\033[34mIllustration:This mode is mainly used to flexibly generate dummies, and only one hierarchy can be \033[0m
\033[34mspecified at a time; \033[0m
\033[36m--------------------------------------------------------------------------------------------------------------------\033[0m
\033[34mUsage: \033[0m
\033[34mfirstly, you must configration dbdir and wave: \033[0m
\033[32m DummyGen -config -dbdir=/proj/sim/simv.dadir \033[0m
\033[32m DummyGen -config -wave=/proj/sim/wave.fsdb \033[0m
\033[34mthan you can generate the dummy file like this command: \033[0m
\033[32m DummyGen -sphier=tb_top.dut.kk.* -start_time=4000 -delay_time=500 -event=tb_top.dut.a=1 \033[0m
\033[34mor like this: \033[0m
\033[32m DummyGen -sphier=tb_top.dut.kk.add -delay_time=500 \033[0m
\033[36m====================================================================================================================\033[0m
"""
def print_spc(sphier,event,start_time,delay_time,dummydir):
print("\n\033[34m"+"=============================="+"\033[0m")
print( "\033[34m"+">= START FREEDOM MODE GEN =<"+"\033[0m")
print( "\033[34m"+"=============================="+"\033[0m\n")
print("\033[32m"+"=======CFG INFO======="+"\033[0m\n")
print("\033[32m"+"sphier="+sphier+"\033[0m")
print("\033[32m"+"event="+event+"\033[0m")
print("\033[32m"+"start_time="+str(start_time)+"\033[0m")
print("\033[32m"+"delay_time="+str(delay_time)+"\033[0m")
print("\033[32m"+"dummydir"+dummydir+"\033[0m")
print("\n\033[32m"+"======================"+"\033[0m\n")
def do_help():
print(help_info)
def can_find(llist,key):
for index in llist:
if key in index:
return True
break
return False
def do_config(cfg_list):
hier_list=[]
dbdir=""
wave=""
delay_time = "0"
start_time = "0"
dummydir = "./"
event = "no"
hire_list_en = 0
dummydir_en = 0
delay_en = 0
start_en = 0
event_en = 0
dbdir_en = 0
wave_en = 0
clear_en = 0
for part in cfg_list:
if hier_list.count(part.replace("+hier=","")) == 0 \
and "+hier=" in part:
hire_list_en = 1
hier_list.append(part.replace("+hier=",""))
if "-dbdir=" in part:
dbdir = part.replace('-dbdir=','')
dbdir_en = 1
if "-wave=" in part:
wave = part.replace('-wave=','')
wave_en = 1
if "-delay_time=" in part:
delay_time = part.replace('-delay_time=','')
delay_en = 1
if "-start_time=" in part:
start_time = part.replace('-start_time=','')
start_en = 1
if "-event=" in part:
event = part.replace('-event=','')
event_en = 1
if "-dummydir=" in part:
dummydir = part.replace('-dummydir=','')
dummydir_en = 1
if "-clear" in part:
clear_en = 1
fh=open(sys.path[0]+"/hier.list","a+")
if hire_list_en == 1:
fh.truncate(0)
for value in hier_list:
fh.writelines(value+"\n")
fh.close()
fc=open(sys.path[0]+"/cfg.list","r")
clines = fc.readlines()
fc.close()
fc=open(sys.path[0]+"/cfg.list","a+")
fc.truncate(0)
if clear_en == 1:
fc.writelines("dbdir="+dbdir+"\n")
fc.writelines("wave="+wave+"\n")
fc.writelines("delay_time="+delay_time+"\n")
fc.writelines("start_time="+start_time+"\n")
fc.writelines("event="+event+"\n")
fc.writelines("dummydir="+dummydir+"\n")
fc.close()
fc=open(sys.path[0]+"/cfg.list","r")
clines = fc.readlines()
print("\n\033[32m=================cfg information==============\033[0m\n")
for line in clines:
print(line.replace("\n",""))
print("\n\033[32m=====end display=====.........................\033[0m\n")
fc.close()
fh=open(sys.path[0]+"/hier.list","r")
hlines = fh.readlines()
print("\n\033[32m================hier information===============\033[0m\n")
for line in hlines:
print(line.replace("\n",""))
print("\n\033[32m=====end display=====..........................\033[0m\n")
fh.close()
return
for line in clines:
if "dbdir=" in line:
dbdir_line = line
if "wave=" in line:
wave_line = line
if "delay_time=" in line:
delay_line = line
if "start_time=" in line:
start_line = line
if "event=" in line:
event_line = line
if "dummydir=" in line:
dummydir_line = line
#print(can_find(clines,"dbdir="))
if dbdir_en == 1 or not can_find(clines,"dbdir="):
fc.writelines("dbdir="+dbdir+"\n")
else:
fc.writelines(dbdir_line)
if wave_en == 1 or not can_find(clines,"wave="):
fc.writelines("wave="+wave+"\n")
else:
fc.writelines(wave_line)
if delay_en == 1 or not can_find(clines,"delay_time="):
fc.writelines("delay_time="+delay_time+"\n")
else:
fc.writelines(delay_line)
if start_en == 1 or not can_find(clines,"start_time="):
fc.writelines("start_time="+start_time+"\n")
else:
fc.writelines(start_line)
if event_en == 1 or not can_find(clines,"event="):
fc.writelines("event="+event+"\n")
else:
fc.writelines(event_line)
if dummydir_en == 1 or not can_find(clines,"dummydir="):
fc.writelines("dummydir="+dummydir+"\n")
else:
fc.writelines(dummydir_line)
fc.close()
fc=open(sys.path[0]+"/cfg.list","r")
clines = fc.readlines()
print("\n\033[32m=================cfg information==============\033[0m\n")
for line in clines:
print(line.replace("\n",""))
print("\n\033[32m=====end display=====.........................\033[0m\n")
fc.close()
fh=open(sys.path[0]+"/hier.list","r")
hlines = fh.readlines()
print("\n\033[32m================hier information===============\033[0m\n")
for line in hlines:
print(line.replace("\n",""))
print("\n\033[32m=====end display=====..........................\033[0m\n")
fh.close()
#!/bin/python3
# -*-coding :utf-8 -*-
#========================================================================
# File : DummyGen.py
# Author : Gavin
# Email : wmchappy@outlook.com
# Data : 2023-04-20\uff0cCreated
#
# Description :
#
# Details :
#
#=======================================================================
import re
import sys
import os
import comm
import hier_load
is_config = 0
is_help = 0
is_sphier = 0
is_default = 0
start_time = 0
delay_time = 0
time = 0
event = "no"
dummydir = "./"
def do_config(cfg_list):
comm.do_config(cfg_list)
def do_help():
comm.do_help()
def do_hier():
hier_load.do_hier()
def do_one_hier(hier,event,start_time,delay_time,dummydir):
hier_load.do_one_hier(hier,event,start_time,delay_time,dummydir)
cfg_list = sys.argv
for argv in sys.argv:
if "-config" == argv or "-clear" == argv:
is_config = 1
if "-help" == argv:
is_help = 1
if "-sphier=" in argv:
is_sphier = 1
sphier = (argv.replace('-sphier=','')).strip()
if "-start_time=" in argv:
start_time = int(argv.replace('-start_time=',''))
if "-delay_time=" in argv:
delay_time = int(argv.replace('-delay_time=',''))
if "-event=" in argv:
event = (argv.replace('-event=','')).strip()
if "-dummydir=" in argv:
dummydir = (argv.replace('-dummydir=','')).strip()
if "-default" == argv:
is_default = 1
if is_config == 1:
do_config(cfg_list)
elif is_help == 1:
do_help()
elif is_sphier == 1:
comm.print_spc(sphier,event,start_time,delay_time,dummydir)
do_one_hier(sphier,event,start_time,delay_time,dummydir)
print("\n\033[34m"+"=============================="+"\033[0m")
print( "\033[34m"+">= GEN SUCCESS =<"+"\033[0m")
print( "\033[34m"+"=============================="+"\033[0m\n")
elif is_default == 1:
print("\n\033[34m"+"=============================="+"\033[0m")
print( "\033[34m"+">= START DEFAULT MODE GEN =<"+"\033[0m")
print( "\033[34m"+"=============================="+"\033[0m\n")
do_hier()
print("\n\033[34m"+"=============================="+"\033[0m")
print( "\033[34m"+">= GEN ALL SUCCESS =<"+"\033[0m")
print( "\033[34m"+"=============================="+"\033[0m\n")
else :
print("Error:No item Get")
#!/bin/python3
# -*-coding :utf-8 -*-
#========================================================================
# File : filegen.py
# Author : Gavin
# Email : wmchappy@outlook.com
# Data : 2023-04-20\uff0cCreated
#
# Description :
#
# Details :
#
#=======================================================================
import os
def gen_file(signalList,valueList,paramList,module,path="") :
if not os.path.exists(path):
os.makedirs(path)
first_line = 1
fg=open(path+"/"+module+".sv","a+")
fg.truncate(0)
line = "module "+module+" ("
fg.writelines(line+"\n")
tplt_dou = "{:<10}"
tplt = "{:<10}\t{:<10}\t{:<10}\t{:<20}\t{:<10}"
tp_sigvalue = "{:<20}\t{:<5}\t{:<10}\t{:<10}"
for signal in signalList:
#print(type(signal.direction(False)))
if signal.direction(False) == "npiFsdbDirInput":
direct = "input"
elif signal.direction(False) == "npiFsdbDirOutput":
direct = "output"
elif signal.direction(False) == "npiFsdbDirInout":
direct = "inout"
else:
direct = "no"
if direct != "no" :
mb_str = " "
if signal.has_member() :
sigList = signal.member_list()
mb_str = "["+str(len(sigList))+"-1:0]"
if first_line==1:
line = " "+tplt.format(direct,"wire","["+str(signal.left_range())+":"+str(signal.right_range())+"]",signal.name(),mb_str)
first_line = 0
else:
line = tplt_dou.format(",")+"\n"+" "+tplt.format(direct,"wire","["+str(signal.left_range())+":"+str(signal.right_range())+"]",signal.name(),mb_str)
fg.writelines(line)
line=("\n"+");")
fg.writelines(line+"\n")
for param in paramList :
line=" parameter "+param+"=0;"
fg.writelines(line+"\n")
for sig_value in valueList :
line = " assign "+ tp_sigvalue.format(sig_value[0],"=",sig_value[1],";")
fg.writelines(line+"\n")
fg.writelines("endmodule")
#!/bin/python3
# -*-coding :utf-8 -*-
#========================================================================
# File : hier.py
# Author : Gavin
# Email : wmchappy@outlook.com
# Data : 2023-04-20\uff0cCreated
#
# Description :
#
# Details :
#
#=======================================================================
import os
import re
import sys
import filegen
rel_lib_path = os.environ['VERDI_HOME'] + '/share/NPI/python'
sys.path.append(os.path.abspath(rel_lib_path))
from pynpi import npisys
from pynpi import waveform
from pynpi import lang
from pynpi import text
def get_dbdir():
get_ok = 0
fc=open(sys.path[0]+"/cfg.list","r")
cfg_list=fc.readlines()
for cfg in cfg_list:
if "dbdir=" in cfg:
cfg=cfg.replace("dbdir=","")
cfg=cfg.replace("\n","")
get_ok = 1
break
if get_ok == 0:
return "simv.daidir"
else:
return cfg
def get_wave():
get_ok = 0
fc=open(sys.path[0]+"/cfg.list","r")
cfg_list=fc.readlines()
for cfg in cfg_list:
if "wave=" in cfg:
cfg=cfg.replace("wave=","")
cfg=cfg.replace("\n","")
get_ok = 1
break
if get_ok == 0:
return "wave.vf"
else:
return cfg
def get_hier_info(waveHandle,HierName,event,start_time=0,delay_time=0,dummydir="./"):
paramList = []
valueList = []
event_time = 0
event_str = ""
event_strl = re.findall("^(.*?)=",event)
event_str = "".join(event_strl)
value_strl = re.findall("=(.*?)$",event)
value_str = "".join(value_strl)
scope = waveHandle.scope_by_name(HierName)
if not scope :
print("\033[31m"+"Please Check Your Hier, Don't Have This Hier In Your Design"+"\033[0m")
return
module_name=scope.def_name()
fileHdl = text.file_by_module_name(module_name)
file_path=fileHdl.file_full_name()
file_name=fileHdl.file_name()
signalList=scope.sig_list()
inst_hdl = lang.handle_by_name(HierName, None)
para_hdl_list = inst_hdl.parameter_handles()
for hdl in para_hdl_list:
hdl_info_list=lang.get_hdl_info(hdl).split(",")
paramList.append(hdl_info_list[1].replace(HierName+".",""))
start_time = waveform.convert_time_in(waveHandle, start_time, "ns")
if event != "no":
event_time = waveform.sig_find_value_forward(waveHandle,event_str,value_str, start_time , waveform.VctFormat_e.HexStrVal)
print(" \033[34m"+"!!!---EVENT TRIGGERED---!!! TIME IS : " + str(event_time) +"fs"+"\033[0m",end="")
else:
event_time = start_time
time_unit = waveform.time_scale_unit(waveHandle)
delay_time = waveform.convert_time_in(waveHandle, delay_time, "ns")
for signal in signalList :
keylist = []
if signal.direction(False) == "npiFsdbDirOutput":
if signal.has_member() :
memList = signal.member_list()
#print(len(memList))
for i in range(0,len(memList)):
keylist = []
value = waveform.sig_value_at(waveHandle,HierName+"."+signal.name()+"["+str(i)+"]",event_time+delay_time, waveform.VctFormat_e.HexStrVal)
keylist.append(signal.name()+"["+str(i)+"]")
keylist.append("\'h"+value)
valueList.append(keylist)
else:
value = waveform.sig_value_at(waveHandle,HierName+"."+signal.name(),event_time+delay_time, waveform.VctFormat_e.HexStrVal)
keylist.append(signal.name())
keylist.append("\'h"+value)
valueList.append(keylist)
filegen.gen_file(signalList,valueList,paramList,module_name,dummydir)
def do_one_hier(hier,event,start_time,delay_time,dummydir):
dbdir = get_dbdir()
wave = get_wave()
argv_list = []
argv_list.append("-dbdir")
argv_list.append(dbdir)
hier_list = []
if not npisys.init(argv_list):
print("Warning: Fail to initialize NPI.")
argv_list.remove(dbdir)
argv_list.append("simv.daidir")
if not npisys.init(argv_list):
print("Error: Fail to initialize NPI.")
assert 0
if not npisys.load_design(argv_list):
print("Warning: Fail to load design.")
argv_list.remove(dbdir)
argv_list.append("./simv.daidir")
# for argv in argv_list:
# print(argv)
if not npisys.init(argv_list):
print("Error: Fail to load design.")
assert 0
waveHandle = waveform.open(wave)
if "*" not in hier:
print("\n\033[34m"+"Start Gen this hier:"+hier+"\033[0m",end="")
get_hier_info(waveHandle,hier,event,start_time,delay_time,dummydir)
else:
parent_hier=hier.replace(".*","")
scope = waveHandle.scope_by_name(parent_hier)
scopeList = scope.child_scope_list()
for ch_scope in scopeList :
if ch_scope.type(False)=="npiFsdbScopeSvModule":
print("\n\033[34m"+"Start Gen this hier:"+ch_scope.full_name()+"\033[0m",end="")
get_hier_info(waveHandle,ch_scope.full_name(),event,start_time,delay_time,dummydir)
print("\033[34m"+" Gen Success"+"\033[0m")
npisys.end()
def do_hier():
delay_time = 0
start_time = 0
fh=open(sys.path[0]+"/hier.list","r")
fc=open(sys.path[0]+"/cfg.list","r")
clines=fc.readlines()
print("\033[32m==========You will gen module(s) file which use these cfg:\033[0m\n")
for line in clines:
print(line.replace("\n",""))
print("\n\033[32m==========\033[0m\n")
for line in clines:
if "delay_time=" in line:
delay_time = int(line.replace("delay_time=",""))
if "start_time=" in line:
start_time = int(line.replace("start_time=",""))
if "event=" in line:
event = (line.replace("event=","")).strip()
if "dummydir=" in line:
dummydir = (line.replace('dummydir=','')).strip()
lines=fh.readlines()
print("\033[32m=========You will gen module(s) file which use these hier:\033[0m\n")
for line in lines:
print(line.replace("\n",""))
print("\n\033[32m=========\033[0m\n")
print("\n\033[34m ...\033[0m")
print("\033[34m========= ......\033[0m")
print("\033[34m========= START GEN ALL..........\033[0m")
print("\033[34m========= ......\033[0m")
print("\033[34m ...\033[0m \n")
for line in lines:
hier = line.replace("\n","")
do_one_hier(hier,event,start_time,delay_time,dummydir)
dbdir=TMP_SIM/xp5_top/default/smoke.tcs/simv.daidir wave=TMP_SIM/xp5_top/default/smoke.tcs/wave.fsdb delay_time=1000 start_time=0 event=no dummydir=dummy_db
sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uxvss_cluster.u_xvss_cfe_top sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uxvss_cluster.u_xvss_cpb_top sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uxvss_cluster.u_xvss_cpostp_top sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uxvss_cluster.u_xvss_cse_top sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uxvss_cluster.u_xvss_vpu_top sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uAI_IC_WRAP_E sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uAI_IC_WRAP_SE sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uAI_IC_WRAP_SW sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uAI_IC_WRAP_W sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uMEDIASS.uBKISP_WRAP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uMEDIASS.uMIPITX_DP_WRAP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uMEDIASS.uVD_WRAP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uMEDIASS.uVE_WRAP_0 sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uHSPSS_WRAP.uHSPSS.uETHER_WRAP_0 sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uHSPSS_WRAP.uHSPSS.uPCIE_WRAP_0 sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uHSPSS_WRAP.uHSPSS.uUSB_WRAP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uHSPSS_WRAP.uHSPSS.uUFS_WRAP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uHSPSS_WRAP.uSMMU_HSP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uAPSS_WRAP.uSMMU_HSP_APSS sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uAPSS_WRAP.uAPSS_TOP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uNPC_WRAP0.unpc_top sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uHSPSS_WRAP.uHSPSS sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uDDRSS_L sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uGPUSS sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uMEDIASS sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uMIPIRXSS sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uSCP_TOP sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uSSPSS sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.ucvc_subsys sim_top.uchip_top.uAI_XP5_TOP.uAI_LOGIC_TOP.uxvss_cluster sim_top.uchip_top.uSI_XP5_TOP.uSI_LOGIC_TOP.uSPU_TOP
https://wmchappy.cn/2015/07/31/jsjl-compute/
CPU GPU XPU…