192 lines
83 KiB
Plaintext
192 lines
83 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"id": "6e833fe7",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"import pandas as pd\n",
|
||
|
|
"import json\n",
|
||
|
|
"import re\n",
|
||
|
|
"\n",
|
||
|
|
"def parse_range_string(s):\n",
|
||
|
|
" if pd.isna(s):\n",
|
||
|
|
" s = \"NA\"\n",
|
||
|
|
"\n",
|
||
|
|
" # 尝试匹配花括号 {} 格式\n",
|
||
|
|
" match = re.match(r\"{(.*)}\", s.strip())\n",
|
||
|
|
" if match:\n",
|
||
|
|
" items = [x.strip() for x in match.group(1).split(\",\")]\n",
|
||
|
|
" return items, \"set\"\n",
|
||
|
|
" \n",
|
||
|
|
" # 尝试匹配方括号 [] 格式\n",
|
||
|
|
" match = re.match(r\"\\[(.*)\\]\", s.strip())\n",
|
||
|
|
" if match:\n",
|
||
|
|
" items = [x.strip() for x in match.group(1).split(\",\")]\n",
|
||
|
|
" return items, \"list\"\n",
|
||
|
|
" \n",
|
||
|
|
" # 都不是集合或列表格式\n",
|
||
|
|
" return s, \"str\"\n",
|
||
|
|
"\n",
|
||
|
|
"def parse_xls_register(file_path):\n",
|
||
|
|
" # 读取header sheet\n",
|
||
|
|
" header_df = pd.read_excel(file_path, sheet_name='header', header=None)\n",
|
||
|
|
" header_info = dict(zip(\n",
|
||
|
|
" ['BoardType', 'Version', 'Creator', 'Date', 'Info'],\n",
|
||
|
|
" header_df.iloc[1, :5]\n",
|
||
|
|
" ))\n",
|
||
|
|
"\n",
|
||
|
|
" # 读取mapping sheet\n",
|
||
|
|
" mapping_df = pd.read_excel(file_path, sheet_name='mapping')\n",
|
||
|
|
" mapping_info = {}\n",
|
||
|
|
" channel_type_info = {}\n",
|
||
|
|
" channel_info = {}\n",
|
||
|
|
" \n",
|
||
|
|
" for _, row in mapping_df.iterrows():\n",
|
||
|
|
" if row.iloc[0] == '#' or pd.isna(row['ModuleName']):\n",
|
||
|
|
" if channel_info:\n",
|
||
|
|
" channel_type_info[int(channel_row['ChannelNum'])] = channel_info\n",
|
||
|
|
" mapping_info[channel_type_row['ChannelType']] = channel_type_info\n",
|
||
|
|
" break\n",
|
||
|
|
"\n",
|
||
|
|
" if not pd.isna(row['ChannelType']):\n",
|
||
|
|
" if channel_info:\n",
|
||
|
|
" channel_type_info[int(channel_row['ChannelNum'])] = channel_info\n",
|
||
|
|
" mapping_info[channel_type_row['ChannelType']] = channel_type_info\n",
|
||
|
|
" channel_type_info = {}\n",
|
||
|
|
" channel_type_row = channel_row = row\n",
|
||
|
|
" channel_info = {\n",
|
||
|
|
" 'Exaddr': int(row['Exaddr']),\n",
|
||
|
|
" 'Cid': int(row['Cid']),\n",
|
||
|
|
" 'Modules': {}\n",
|
||
|
|
" }\n",
|
||
|
|
" elif not pd.isna(row['ChannelNum']):\n",
|
||
|
|
" if channel_info:\n",
|
||
|
|
" channel_type_info[int(channel_row['ChannelNum'])] = channel_info\n",
|
||
|
|
" channel_row = row\n",
|
||
|
|
" channel_info = {\n",
|
||
|
|
" 'Exaddr': int(row['Exaddr']),\n",
|
||
|
|
" 'Cid': int(row['Cid']),\n",
|
||
|
|
" 'Modules': {}\n",
|
||
|
|
" }\n",
|
||
|
|
"\n",
|
||
|
|
" if not pd.isna(row['ModuleName']):\n",
|
||
|
|
" module = {k: row[k] for k in ['StartAddress', 'Size', 'Info']}\n",
|
||
|
|
" channel_info['Modules'][row['ModuleName']] = module\n",
|
||
|
|
"\n",
|
||
|
|
" # 读取模块段信息\n",
|
||
|
|
" xls = pd.ExcelFile(file_path)\n",
|
||
|
|
" modules_info = {}\n",
|
||
|
|
" \n",
|
||
|
|
" for sheet_name in xls.sheet_names:\n",
|
||
|
|
" if sheet_name in ['header', 'mapping']:\n",
|
||
|
|
" continue\n",
|
||
|
|
" \n",
|
||
|
|
" seg_df = pd.read_excel(file_path, sheet_name)\n",
|
||
|
|
" segments = {}\n",
|
||
|
|
" current_seg = None\n",
|
||
|
|
"\n",
|
||
|
|
" if 'FieldName' not in seg_df.columns:\n",
|
||
|
|
" # 第一种格式\n",
|
||
|
|
" for _, row in seg_df.iterrows():\n",
|
||
|
|
" if row.iloc[0] == '#':\n",
|
||
|
|
" break\n",
|
||
|
|
"\n",
|
||
|
|
" if not pd.isna(row['OffsetAddress']):\n",
|
||
|
|
" current_seg = {\n",
|
||
|
|
" 'OffsetAddress': row['OffsetAddress'],\n",
|
||
|
|
" 'Permission': row['Permission'],\n",
|
||
|
|
" 'SegDescription': row['SegDescription']\n",
|
||
|
|
" }\n",
|
||
|
|
" segments[row['SegName'].lower()] = current_seg\n",
|
||
|
|
"\n",
|
||
|
|
" else:\n",
|
||
|
|
" # 第二种格式\n",
|
||
|
|
" for _, row in seg_df.iterrows():\n",
|
||
|
|
" if row.iloc[0] == '#':\n",
|
||
|
|
" break\n",
|
||
|
|
" \n",
|
||
|
|
" if not pd.isna(row['OffsetAddress']):\n",
|
||
|
|
" current_seg = {\n",
|
||
|
|
" 'OffsetAddress': row['OffsetAddress'],\n",
|
||
|
|
" 'Permission': row['Permission'],\n",
|
||
|
|
" 'SegDescription': row['SegDescription'],\n",
|
||
|
|
" 'Fields': []\n",
|
||
|
|
" }\n",
|
||
|
|
" segments[row['SegName'].lower()] = current_seg\n",
|
||
|
|
" \n",
|
||
|
|
" if current_seg and not pd.isna(row['Bits']):\n",
|
||
|
|
" field = {\n",
|
||
|
|
" 'Bits': list(map(int, row['Bits'].strip('[]').split(':'))),\n",
|
||
|
|
" 'FieldName': row['FieldName'].lower(),\n",
|
||
|
|
" 'ResetValue': \"NA\" if pd.isna(row['ResetValue']) else row['ResetValue'],\n",
|
||
|
|
" 'Range': dict(zip([\"value\",\"type\"], parse_range_string(row['Range']))),\n",
|
||
|
|
" 'FieldDescription': row['FieldDescription']\n",
|
||
|
|
" }\n",
|
||
|
|
" current_seg['Fields'].append(field)\n",
|
||
|
|
" \n",
|
||
|
|
" modules_info[sheet_name] = segments\n",
|
||
|
|
"\n",
|
||
|
|
" return {\n",
|
||
|
|
" 'HeaderInfo': header_info,\n",
|
||
|
|
" 'MappingInfo': mapping_info,\n",
|
||
|
|
" 'Modules': modules_info\n",
|
||
|
|
" }\n",
|
||
|
|
"\n",
|
||
|
|
"# 使用示例\n",
|
||
|
|
"if __name__ == \"__main__\":\n",
|
||
|
|
" file_name = \"读出子系统IDS表\"\n",
|
||
|
|
" register_data = parse_xls_register(f\"{file_name}.xls\")\n",
|
||
|
|
"\n",
|
||
|
|
" with open(f\"../ids/{file_name}.json\", 'w', encoding='utf-8') as f:\n",
|
||
|
|
" json.dump(register_data, f, ensure_ascii=False, indent=4)\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"id": "2fd87a52",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"{'HeaderInfo': {'BoardType': 'READOUT', 'Version': '1.0.0', 'Creator': '郭成', 'Date': '2025.08.21', 'Info': 'READOUT子系统FPGA平台地址映射表'}, 'MappingInfo': {'msmt_acq': {'0': {'Exaddr': 0, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00200000', 'Size': '16KB', 'Info': '采集通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00300000', 'Size': '16KB', 'Info': '采集通道MCU初始数据配置'}, 'DAQ_REG': {'StartAddress': '0x00400000', 'Size': '256B', 'Info': '采集通道控制寄存器配置'}, 'DAQ_PAR': {'StartAddress': '0x00500000', 'Size': '32KB', 'Info': '采集通道读出参数配置'}, 'DAQ_FLT': {'StartAddress': '0x00580000', 'Size': '512KB', 'Info': '采集通道匹配滤波器系数配置'}}}, '1': {'Exaddr': 1, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00200000', 'Size': '16KB', 'Info': '采集通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00300000', 'Size': '16KB', 'Info': '采集通道MCU初始数据配置'}, 'DAQ_REG': {'StartAddress': '0x00400000', 'Size': '256B', 'Info': '采集通道控制寄存器配置'}, 'DAQ_PAR': {'StartAddress': '0x00500000', 'Size': '32KB', 'Info': '采集通道读出参数配置'}, 'DAQ_FLT': {'StartAddress': '0x00580000', 'Size': '512KB', 'Info': '采集通道匹配滤波器系数配置'}}}, '2': {'Exaddr': 2, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00200000', 'Size': '16KB', 'Info': '采集通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00300000', 'Size': '16KB', 'Info': '采集通道MCU初始数据配置'}, 'DAQ_REG': {'StartAddress': '0x00400000', 'Size': '256B', 'Info': '采集通道控制寄存器配置'}, 'DAQ_PAR': {'StartAddress': '0x00500000', 'Size': '32KB', 'Info': '采集通道读出参数配置'}, 'DAQ_FLT': {'StartAddress': '0x00580000', 'Size': '512KB', 'Info': '采集通道匹配滤波器系数配置'}}}, '3': {'Exaddr': 3, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00200000', 'Size': '16KB', 'Info': '采集通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00300000', 'Size': '16KB', 'Info': '采集通道MCU初始数据配置'}, 'DAQ_REG': {'StartAddress': '0x00400000', 'Size': '256B', 'Info': '采集通道控制寄存器配置'}, 'DAQ_PAR': {'StartAddress': '0x00500000', 'Size': '32KB', 'Info': '采集通道读出参数配置'}, 'DAQ_FLT': {'StartAddress': '0x00580000', 'Size': '512KB', 'Info': '采集通道匹配滤波器系数配置'}}}}, 'msmt_exci': {'0': {'Exaddr': 0, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00700000', 'Size': '16KB', 'Info': '激励通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00800000', 'Size': '16KB', 'Info': '激励通道MCU初始数据配置'}, 'AWG_REG': {'StartAddress': '0x00900000', 'Size': '256B', 'Info': '激励通道控制寄存器配置'}, 'AWG_IDX': {'StartAddress': '0x00A00000', 'Size': '1KB', 'Info': '激励通道波形索引表配置'}, 'AWG_WVE': {'StartAddress': '0x00B00000', 'Size': '128KB', 'Info': '激励通道输出波形数据配置'}}}, '1': {'Exaddr': 1, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00700000', 'Size': '16KB', 'Info': '激励通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00800000', 'Size': '16KB', 'Info': '激励通道MCU初始数据配置'}, 'AWG_REG': {'StartAddress': '0x00900000', 'Size': '256B', 'Info': '激励通道控制寄存器配置'}, 'AWG_IDX': {'StartAddress': '0x00A00000', 'Size': '1KB', 'Info': '激励通道波形索引表配置'}, 'AWG_WVE': {'StartAddress': '0x00B00000', 'Size': '128KB', 'Info': '激励通道输出波形数据配置'}}}, '2': {'Exaddr': 2, 'Cid': 0, 'Modules': {'MCU_INS': {'StartAddress': '0x00700000', 'Size': '16KB', 'Info': '激励通道MCU运行指令配置'}, 'MCU_DAT': {'StartAddress': '0x00800000', 'Size': '16KB', 'Info': '激励通道MCU初始数据配置'}, 'AWG_REG': {'StartAddress': '0x00900000', 'Size': '256B', 'Info': '激励通道控制寄存器配置'}, 'AWG_IDX': {'StartAddress': '0x00A00000', 'Size': '1KB', 'Info': '激励通道波形索引表配置'}, 'AWG_WVE': {'StartAddress': '0x
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"with open(f\"../ids/{file_name}.json\", 'r', encoding='utf-8') as f:\n",
|
||
|
|
" data = json.load(f)\n",
|
||
|
|
"\n",
|
||
|
|
"print(data)\n",
|
||
|
|
"# print(data[\"Modules\"][\"SYSTEM_CTRL\"][\"test_2\"][\"Fields\"][0][\"ResetValue\"])"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "base",
|
||
|
|
"language": "python",
|
||
|
|
"name": "python3"
|
||
|
|
},
|
||
|
|
"language_info": {
|
||
|
|
"codemirror_mode": {
|
||
|
|
"name": "ipython",
|
||
|
|
"version": 3
|
||
|
|
},
|
||
|
|
"file_extension": ".py",
|
||
|
|
"mimetype": "text/x-python",
|
||
|
|
"name": "python",
|
||
|
|
"nbconvert_exporter": "python",
|
||
|
|
"pygments_lexer": "ipython3",
|
||
|
|
"version": "3.12.7"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 5
|
||
|
|
}
|