"""Register definition (ids.json) → HTML tables.""" import json from html import escape MODULE_ORDER = [ 'SYS_REG', 'SYS_ANA', 'SYS_PLL', 'DAQ_REG', 'DAQ_PAR', 'DAQ_FLT', 'AWG_REG', 'TRIG_CTRL', 'PUMP_REG', 'MIXER_REG', ] MODULE_DESC = { 'SYS_REG': '系统控制寄存器', 'SYS_ANA': '模拟配置寄存器', 'SYS_PLL': 'PLL 配置寄存器', 'DAQ_REG': 'DAQ 控制寄存器', 'DAQ_PAR': 'DAQ 读出参数配置', 'DAQ_FLT': 'DAQ 匹配滤波器系数', 'AWG_REG': 'AWG 控制寄存器', 'TRIG_CTRL': '触发控制寄存器', 'PUMP_REG': 'Pump 控制寄存器', 'MIXER_REG': '混频器控制寄存器', } def eh(s): return escape(str(s)) def _bits_str(bits): if not bits: return '' if len(bits) == 1 or bits[0] == bits[-1]: return f'[{bits[0]}]' return f'[{bits[0]}:{bits[-1]}]' def _range_str(r): if not r or not r.get('value'): return '' t, v = r.get('type', 'str'), r.get('value', '') if t == 'str': if v == 'ANY': return '任意' if v == 'NA': return '—' return eh(str(v)) if t == 'list' and isinstance(v, list): return f'{v[0]} ~ {v[1]}' if t == 'set' and isinstance(v, list): return ', '.join(str(x) for x in v) return eh(str(v)) def _perm_badge(p): badges = { 'RW': 'RW', 'RO': 'RO', 'WC': 'WC', } return badges.get(p, eh(p)) def render(json_path): """Load ids.json and render all register tables as HTML.""" with open(json_path, encoding='utf-8') as f: data = json.load(f) modules = data.get('Modules', {}) html = [] for mod_name in MODULE_ORDER: if mod_name not in modules: continue entries = modules[mod_name] desc = MODULE_DESC.get(mod_name, '') html.append( f'
共 {len(entries)} 个寄存器/存储段。
') for seg_name, seg in entries.items(): addr = seg.get('OffsetAddress', '') perm = seg.get('Permission', '') sd = seg.get('SegDescription', '') fields = seg.get('Fields', []) html.append( f''
f'偏移地址:{eh(addr)} '
f'权限:{_perm_badge(perm)} '
f'描述:{eh(sd)}
| Bits | ' 'Field Name | ' 'Reset Value | ' 'Range | ' 'Description | ' '
|---|---|---|---|---|
| {_bits_str(b)} | ' f'{eh(f.get("FieldName", ""))} | ' f'{eh(f.get("ResetValue", ""))} | ' f'{_range_str(f.get("Range"))} | ' f'{eh(f.get("FieldDescription", ""))} | ' f'