rbpu_datesheet/script/ids_import.ipynb

192 lines
83 KiB
Plaintext
Raw Normal View History

2025-09-19 11:31:25 +08:00
{
"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
}