From 4922a2f5d336aa85d28e50147d57c05dfe31f8bc Mon Sep 17 00:00:00 2001 From: yangshenbo Date: Tue, 28 Jul 2026 17:57:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=9B=E9=80=9A=E9=81=93?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 4ch-Z_Generator/.idea/.gitignore | 8 + 4ch-Z_Generator/.idea/.name | 1 + 4ch-Z_Generator/.idea/4ch-Z_Generator.iml | 8 + .../inspectionProfiles/Project_Default.xml | 17 + .../inspectionProfiles/profiles_settings.xml | 6 + 4ch-Z_Generator/.idea/misc.xml | 7 + 4ch-Z_Generator/.idea/modules.xml | 8 + .../FourChZAssemblyTemplateManager.py | 300 ++++ 4ch-Z_Generator/FourChZCaseGenerator.ipynb | 404 +++++ 4ch-Z_Generator/FourChZChipConfig.py | 189 +++ 4ch-Z_Generator/FourChZEnvelopeGenerator.py | 194 +++ 4ch-Z_Generator/FourChZreg_define.py | 279 ++++ 4ch-Z_Generator/ParamsManager.py | 56 + ...ChZAssemblyTemplateManager.cpython-311.pyc | Bin 0 -> 13773 bytes .../FourChZChipConfig.cpython-311.pyc | Bin 0 -> 11879 bytes .../FourChZEnvelopeGenerator.cpython-311.pyc | Bin 0 -> 12585 bytes .../FourChZreg_define.cpython-311.pyc | Bin 0 -> 7338 bytes .../__pycache__/ParamsManager.cpython-311.pyc | Bin 0 -> 3205 bytes .../__pycache__/make_case.cpython-311.pyc | Bin 0 -> 5876 bytes .../__pycache__/make_inst.cpython-311.pyc | Bin 0 -> 14374 bytes .../__pycache__/accz_gen.cpython-311.pyc | Bin 0 -> 1567 bytes .../env_gen/__pycache__/acz.cpython-311.pyc | Bin 0 -> 10968 bytes .../__pycache__/flattop.cpython-311.pyc | Bin 0 -> 1332 bytes 4ch-Z_Generator/env_gen/accz.py | 28 + 4ch-Z_Generator/env_gen/accz_gen.py | 19 + 4ch-Z_Generator/env_gen/acz.py | 208 +++ 4ch-Z_Generator/env_gen/flattop.py | 75 + 4ch-Z_Generator/gen_cases/General/env2.json | 150 ++ .../gen_cases/General/env2_HEX.txt | 1452 +++++++++++++++++ .../gen_cases/RAMP/RAMP_MCU_FIXED.json | 49 + .../gen_cases/RAMP/RAMP_MCU_FIXED_HEX.txt | 316 ++++ 4ch-Z_Generator/make_case.py | 93 ++ 4ch-Z_Generator/make_inst.py | 319 ++++ Z_case_Generator_V2.0/ZChipConfig.py | 2 +- .../__pycache__/ZChipConfig.cpython-311.pyc | Bin 18743 -> 18731 bytes .../gen_cases/General/env.json | 4 +- .../gen_cases/General/env_HEX.txt | 71 +- Z_case_Generator_V2.0/z_case_gen.ipynb | 37 +- 38 files changed, 4215 insertions(+), 85 deletions(-) create mode 100644 4ch-Z_Generator/.idea/.gitignore create mode 100644 4ch-Z_Generator/.idea/.name create mode 100644 4ch-Z_Generator/.idea/4ch-Z_Generator.iml create mode 100644 4ch-Z_Generator/.idea/inspectionProfiles/Project_Default.xml create mode 100644 4ch-Z_Generator/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 4ch-Z_Generator/.idea/misc.xml create mode 100644 4ch-Z_Generator/.idea/modules.xml create mode 100644 4ch-Z_Generator/FourChZAssemblyTemplateManager.py create mode 100644 4ch-Z_Generator/FourChZCaseGenerator.ipynb create mode 100644 4ch-Z_Generator/FourChZChipConfig.py create mode 100644 4ch-Z_Generator/FourChZEnvelopeGenerator.py create mode 100644 4ch-Z_Generator/FourChZreg_define.py create mode 100644 4ch-Z_Generator/ParamsManager.py create mode 100644 4ch-Z_Generator/__pycache__/FourChZAssemblyTemplateManager.cpython-311.pyc create mode 100644 4ch-Z_Generator/__pycache__/FourChZChipConfig.cpython-311.pyc create mode 100644 4ch-Z_Generator/__pycache__/FourChZEnvelopeGenerator.cpython-311.pyc create mode 100644 4ch-Z_Generator/__pycache__/FourChZreg_define.cpython-311.pyc create mode 100644 4ch-Z_Generator/__pycache__/ParamsManager.cpython-311.pyc create mode 100644 4ch-Z_Generator/__pycache__/make_case.cpython-311.pyc create mode 100644 4ch-Z_Generator/__pycache__/make_inst.cpython-311.pyc create mode 100644 4ch-Z_Generator/env_gen/__pycache__/accz_gen.cpython-311.pyc create mode 100644 4ch-Z_Generator/env_gen/__pycache__/acz.cpython-311.pyc create mode 100644 4ch-Z_Generator/env_gen/__pycache__/flattop.cpython-311.pyc create mode 100644 4ch-Z_Generator/env_gen/accz.py create mode 100644 4ch-Z_Generator/env_gen/accz_gen.py create mode 100644 4ch-Z_Generator/env_gen/acz.py create mode 100644 4ch-Z_Generator/env_gen/flattop.py create mode 100644 4ch-Z_Generator/gen_cases/General/env2.json create mode 100644 4ch-Z_Generator/gen_cases/General/env2_HEX.txt create mode 100644 4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED.json create mode 100644 4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED_HEX.txt create mode 100644 4ch-Z_Generator/make_case.py create mode 100644 4ch-Z_Generator/make_inst.py diff --git a/4ch-Z_Generator/.idea/.gitignore b/4ch-Z_Generator/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/4ch-Z_Generator/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/4ch-Z_Generator/.idea/.name b/4ch-Z_Generator/.idea/.name new file mode 100644 index 0000000..759fd84 --- /dev/null +++ b/4ch-Z_Generator/.idea/.name @@ -0,0 +1 @@ +FourChZCaseGenerator.ipynb \ No newline at end of file diff --git a/4ch-Z_Generator/.idea/4ch-Z_Generator.iml b/4ch-Z_Generator/.idea/4ch-Z_Generator.iml new file mode 100644 index 0000000..909438d --- /dev/null +++ b/4ch-Z_Generator/.idea/4ch-Z_Generator.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/4ch-Z_Generator/.idea/inspectionProfiles/Project_Default.xml b/4ch-Z_Generator/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..4c429e7 --- /dev/null +++ b/4ch-Z_Generator/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/4ch-Z_Generator/.idea/inspectionProfiles/profiles_settings.xml b/4ch-Z_Generator/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/4ch-Z_Generator/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/4ch-Z_Generator/.idea/misc.xml b/4ch-Z_Generator/.idea/misc.xml new file mode 100644 index 0000000..a6218fe --- /dev/null +++ b/4ch-Z_Generator/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/4ch-Z_Generator/.idea/modules.xml b/4ch-Z_Generator/.idea/modules.xml new file mode 100644 index 0000000..f11a6d6 --- /dev/null +++ b/4ch-Z_Generator/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/4ch-Z_Generator/FourChZAssemblyTemplateManager.py b/4ch-Z_Generator/FourChZAssemblyTemplateManager.py new file mode 100644 index 0000000..e5a5489 --- /dev/null +++ b/4ch-Z_Generator/FourChZAssemblyTemplateManager.py @@ -0,0 +1,300 @@ +import numpy as np +import copy +from typing import List +from FourChZreg_define import * + + +class AssemblyTemplateManager: + """汇编指令模板管理器""" + + def __init__(self, mk_instance, mk_instr, **kwargs): + self.mk = mk_instance + self.mk_instr = mk_instr + self.config_file = kwargs.get('config_file') + self.templates = { + 'general_send_wait': self._generic_awg_control_template, + 'ramp_fixed': self._ramp_mcu_fixed_template, + 'ramp_step': self._ramp_mcu_template + } + + def create_instructions(self, **kwargs): + template_type = kwargs.get('instr_type', str) + params = copy.deepcopy(kwargs) + return self.templates[template_type](**params) + + def _codeword_encode(self, **kwargs): + sendc = kwargs.pop('sendc', 0) + wave_hold = kwargs.pop('wave_hold', 0) + ff_amp_index = kwargs.pop('ff_amp_index', 0) + fm_amp_index = kwargs.pop('fm_amp_index', 0) + bias_index = kwargs.pop('bias_index', 0) + fcw_index = kwargs.pop('fcw_index', 0) + pcw_index = kwargs.pop('pcw_index', 0) + code_clr = kwargs.pop('code_clr', 0) + env_index = kwargs.pop('env_index', 0) + + codeword = 0 + codeword |= sendc << 31 + codeword |= wave_hold << 30 + codeword |= ff_amp_index << 28 + codeword |= fm_amp_index << 26 + codeword |= bias_index << 24 + codeword |= fcw_index << 22 + codeword |= pcw_index << 19 + codeword |= code_clr << 18 + codeword |= env_index << 12 + + return codeword + + def _codeword_gen(self, **kwargs): + codeword_configs = kwargs.pop('codeword_configs', []) + codeword_list = [] + for config in codeword_configs: + codeword = self._codeword_encode(**config) + codeword_list.append(codeword) + return codeword_list + + def write_register(self, address, value): + self.mk.rw_once('w', address, value, self.config_file) + + def _generic_awg_control_template(self, **kwargs): + """ + 通用 AWG汇编控制模版 (支持扫参) + """ + channel = kwargs.get('channel', 0) + codeword_list = self._codeword_gen(**kwargs) + send_interval_list = kwargs.get('send_interval', [100]) + cycle_num = kwargs.get('cycle_num', 1) + sweep_config = kwargs.get('sweep_config', {}) + sweep_num = sweep_config.get('sweep_num', 1) + sweep_offsets = sweep_config.get('offsets', []) + sweep_steps = sweep_config.get('steps', []) + sweep_reg_num = len(sweep_offsets) + + dtcm_payload = [sweep_num, cycle_num, len(codeword_list), sweep_reg_num] + + for cw, wait_clk in zip(codeword_list, send_interval_list): + dtcm_payload.append(cw) + dtcm_payload.append(wait_clk) + + if sweep_reg_num > 0: + dtcm_payload.extend(sweep_offsets) + dtcm_payload.extend([s & 0xFFFFFFFF for s in sweep_steps]) + + dtcm_base = addr_base['DTCM0_BASE'] + channel * 0x600000 + target_addr = dtcm_base + FourChZreg_define['mcu_reg']['DTFR'] + 4 + self.write_register(target_addr, dtcm_payload) + + return f""" + start: + lui x1 , 0x100 + lui x2 , 0x200 + + addi x3 , x0 , 4 + addi x4 , x0 , 22 + addi x5 , x1 , 0x40 + addi x6 , x2 , 0x40 + + load_nco_params_loop: + addi x4 , x4 , -1 + lw x31, 0x00(x5) + sw x31, 0x00(x6) + add x5 , x5 , x3 + add x6 , x6 , x3 + bne x4 , x0 , load_nco_params_loop + + lw x31, 0xb4(x1) + sw x31, 0xb4(x2) + + lw x10, 0xdc(x1) + lw x11, 0xe0(x1) + lw x12, 0xe4(x1) + lw x17, 0xe8(x1) + + addi x13, x1 , 0xec + slli x14, x12, 3 + add x18, x13, x14 + slli x14, x17, 2 + add x20, x18, x14 + + run_sweep_iteration: + addi x28, x11, 0 + middle_ensemble_loop: + addi x28, x28, -1 + addi x26, x12, 0 + addi x25, x13, 0 + + inner_wave_send_loop: + addi x26, x26, -1 + lw x31, 0x00(x25) + lw x30, 0x04(x25) + addi x25, x25, 8 + + send x0 , x31, 0 + + bne x26, x0 , inner_wait_branch + beq x0 , x0 , outer_wait_branch + + inner_wait_branch: + wait x0 , x30, -24 + bne x26, x0 , inner_wave_send_loop + + outer_wait_branch: + wait x0 , x30, -36 + bne x28, x0 , middle_ensemble_loop + + beq x10, x0 , mcu_exit + addi x10, x10, -1 + wait x0 , x0 , 100 + + beq x17, x0 , run_sweep_iteration + addi x4 , x17, 0 + addi x21, x18, 0 + addi x23, x20, 0 + + update_param_loop: + addi x4 , x4 , -1 + lw x29, 0(x21) + lw x24, 0(x23) + + add x5 , x1 , x29 + lw x31, 0(x5) + add x31, x31, x24 + sw x31, 0(x5) + + add x6 , x2 , x29 + sw x31, 0(x6) + + addi x21, x21, 4 + addi x23, x23, 4 + bne x4 , x0 , update_param_loop + + beq x0 , x0 , run_sweep_iteration + + mcu_exit: + exit x0 , x0 , 0 + """ + + def _ramp_mcu_template(self, **kwargs): + channel = kwargs.pop('channel') + ramp_mcu_registers = [] + ramp_mcu_registers.append(0 << 16) + ramp_mcu_registers += [1 << 31] + param_num = kwargs.pop('param_num') + ensemble_num = kwargs.pop('ensemble_num') + ramp_mcu_registers.append(param_num) + ramp_mcu_registers.append(ensemble_num) + height_list = kwargs.pop('height', 0) + length_list = kwargs.pop('step_time', 0) + for height, length in zip(height_list, length_list): + ramp_mcu_registers += [height << 16] + ramp_mcu_registers += [length] + wait = 65536 / height * length + ramp_mcu_registers += [wait] + + dtcm_base = addr_base['DTCM0_BASE'] + channel * 0x600000 + target_addr = dtcm_base + FourChZreg_define['mcu_reg']['DTFR'] + 4 + self.write_register(target_addr, ramp_mcu_registers) + + return f""" + start: + lui x1 , 0x100 + lui x2 , 0x200 + lw x31, 0xdc(x1) + sw x31, 0xb8(x2) + lw x28, 0xe0(x1) + addi x6 , x0, 12 + lw x7 , 0xe8(x1) + ensemble_loop: + addi x7 , x7, -1 + addi x8 , x1, 0 + lw x5 , 0xe4(x1) + ramp_loop: + addi x5, x5, -1 + lw x31, 0xec(x8) + lw x30, 0xf0(x8) + lw x29, 0xf4(x8) + add x8 , x8 , x6 + sw x30, 0xc0(x2) + sw x31, 0xbc(x2) + sw x28, 0xc4(x2) + wait x0 , x29, -30 + bne x5 , x0 , ramp_loop + bne x7 , x0 , ensemble_loop + sw x0, 0xc4(x2) + exit x0, x0, 0 + """ + + def _ramp_mcu_fixed_template(self, **kwargs): + channel = kwargs.pop('channel') + ramp_mcu_registers = [] + ramp_mcu_registers += [1 << 31] + ensemble_num = kwargs.pop('ensemble_num') + config_param_num = kwargs.pop('config_param_num') + ramp_mcu_registers.append(ensemble_num) + ramp_mcu_registers.append(config_param_num) + fixed_value_list = kwargs.pop('fixed_value') + wait_list = kwargs.pop('wait_clk') + for fixed_value, wait_clk in zip(fixed_value_list, wait_list): + ramp_mcu_registers += [fixed_value << 16 | 1 << 15] + ramp_mcu_registers += [wait_clk] + dtcm_base = addr_base['DTCM0_BASE'] + channel * 0x600000 + target_addr = dtcm_base + FourChZreg_define['mcu_reg']['DTFR'] + 4 + self.write_register(target_addr, ramp_mcu_registers) + + return f""" + start: + lui x1 , 0x100 + lui x2 , 0x200 + lw x31, 0xdc(x1) + sw x31, 0xc4(x2) + addi x3 , x0, 8 + lw x4 , 0xe0(x1) + ensemble_loop: + addi x4 , x4, -1 + addi x6 , x1, 0 + lw x5 , 0xe4(x1) + ramp_loop: + addi x5, x5, -1 + lw x31, 0xe8(x6) + lw x30, 0xec(x6) + sw x31, 0xb8(x2) + add x6 , x6 , x3 + bne x5 , x0 , ramp_loop_wait + jal x0 , ensemble_loop_wait + ramp_loop_wait: + wait x0 , x30, -24 + jal x0 , ramp_loop + ensemble_loop_wait: + wait x0 , x30, -36 + bne x4 , x0 , ensemble_loop + exit: + wait x0 , x0, 15 + sw x0, 0xb8(x2) + sw x0, 0xc4(x2) + exit x0, x0, 0 + """ + + def _write_machine_codes_to_chip(self, machine_codes: str, **kwargs): + # 修正:同时把通道号传给 make_inst 的 channel_id 字段 + channel = kwargs.pop('channel') + self.mk_instr.write( + machine_codes, + self.config_file, + channel_id=channel, + show=kwargs.pop('instr_show', False) + ) + if 'inner_sync' in kwargs: + inner_sync = kwargs.pop('inner_sync') + if inner_sync: + self.write_register(addr_base['SYST_BASE'] + FourChZreg_define['sys_reg']['SYNCR'], 15 << 28 | 1 << 17) + self.mk.rw_once('r', addr_base['SYST_BASE'] + FourChZreg_define['pll_reg']['INTPLL_CLKRXPD'], [0] * 20, + self.config_file) + self.mk.rw_once('r', addr_base['DBGM_BASE'], [0] * 2048, self.config_file) + + +def instruction_config(mk_instance, mk_instr, **kwargs): + # 直接将 **kwargs 传入,__init__ 会自动匹配字典里的 'channel_id',彻底避免重复传参报错 + asm_templates = AssemblyTemplateManager(mk_instance, mk_instr, **kwargs) + machine_codes = asm_templates.create_instructions(**kwargs) + asm_templates._write_machine_codes_to_chip(machine_codes, **kwargs) \ No newline at end of file diff --git a/4ch-Z_Generator/FourChZCaseGenerator.ipynb b/4ch-Z_Generator/FourChZCaseGenerator.ipynb new file mode 100644 index 0000000..c2007c4 --- /dev/null +++ b/4ch-Z_Generator/FourChZCaseGenerator.ipynb @@ -0,0 +1,404 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-07-28T09:50:05.947705Z", + "start_time": "2026-07-28T09:50:05.940378Z" + } + }, + "source": [ + "import sys\n", + "import os\n", + "import numpy as np\n", + "from make_case import *\n", + "from make_inst import *\n", + "from FourChZChipConfig import *\n", + "from FourChZAssemblyTemplateManager import *\n", + "from FourChZEnvelopeGenerator import *\n", + "from FourChZreg_define import *\n", + "from ParamsManager import ParamsManager\n", + "from copy import deepcopy\n", + "from itertools import product\n", + "from pathlib import Path\n", + "mk = make_case()\n", + "mk_instr = make_inst()\n", + "from pathlib import Path\n", + "def run_case(params, save_json=True, write_hw=False):\n", + " \"\"\"\n", + " 通用执行函数:自动判断模式并按需调用 configure_chip_output, env_config, instruction_config\n", + " :param output_dir: 可选,自定义输出文件和 JSON 保存的目录路径\n", + " \"\"\"\n", + " # 1. 确定最终输出目录\n", + " base_dir = Path('D:/MyDocument/工作/Z芯片的case生成器/4ch-Z_Generator/gen_cases') # 在这边选择case目录所在位置\n", + " folder_name = params.get('FolderName', 'General') #文件夹名不用在这边改,在case参数里面改\n", + " out_dir = base_dir / folder_name\n", + " \n", + " case_name = params['CaseName'] #Case名不用在这边改,在case参数里面改\n", + " config_file_path = out_dir / f\"{case_name}_HEX.txt\"\n", + " # 更新 params 中的路径信息\n", + " params['config_file'] = str(config_file_path)\n", + " \n", + " # 2. 自动创建目录并初始化保存器\n", + " pm = ParamsManager(out_dir)\n", + " if save_json:\n", + " pm.save(params, case_name)\n", + " \n", + " # 3. 基础芯片输出配置\n", + " config_chip_reg(mk, **params)\n", + " print(\"执行 config_chip_reg\")\n", + " \n", + " # 4. 自动识别并执行包络配置\n", + " if 'envelope_configs' in params or 'envelope_type' in params or 'amp' in params:\n", + " if 'env_config' in globals():\n", + " env_config(mk, **params)\n", + " print(\"执行了 env_config\")\n", + " \n", + " # 5. 自动识别并执行指令配置\n", + " if 'instr_type' in params:\n", + " instruction_config(mk, mk_instr, **params)\n", + " print(\"执行了 instruction_config\")\n", + " \n", + " \n", + " # 7. 基础硬件寄存器下发\n", + " if write_hw:\n", + " channel = params['channel']\n", + " envm_base =addr_base['ENVM0_BASE'] + channel* 0x600000\n", + " itcm_base = addr_base['ITCM0_BASE'] + channel* 0x600000\n", + " mk.rw_once('w',envm_base , 0, params['config_file'])\n", + " instr_type = params.get('instr_type', None)\n", + " if instr_type is None:\n", + " mk.rw_once('w', itcm_base, '0x2B', params['config_file'])\n", + "\n", + " print(f\"生成文件路径:{config_file_path.resolve()}\")\n", + " return None\n", + "\n" + ], + "outputs": [], + "execution_count": 34 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-28T09:52:50.467599Z", + "start_time": "2026-07-28T09:52:50.435623Z" + } + }, + "cell_type": "code", + "source": [ + "#general_send_wait这个汇编模板的 SEND_WAIT效果示例。\n", + "#单通道 AWG通用模板\n", + "param_ch0 = {\n", + " 'channel' : 0,\n", + " 'chip_mode':'AWG', #分为AWG和RAMP模式\n", + " 'mode':'mod', #可选nco nco_fm env mod四种模式\n", + " 'tail_en': False, #拖尾矫正开关\n", + " 'tc_coef_set': 'coef3', #拖尾矫正打开生效\n", + " 'inner_sync': False, #内部触发,应该是软触发,写一个寄存器,就能触发\n", + " 'amp_mod_enable': True, #调幅的开关,mod调制模式下起作用。\n", + " 'freq_mod_enable': True, #nco的开关\n", + " 'bias_enable': True, #必开的开关,AWG模式下,偏置必须打开,否则AWG输出保持为0.\n", + " \n", + " 'fcw': [100, 200, 300, 400], # MHz\n", + " 'mcu_reg_clr': True,\n", + " 'pcw': [0, 30, 45, 90, 120, 135, 150, 180], # Deg \n", + " 'rz_ff_pha': 0,\n", + " 'rz_fm_pha': 45,\n", + " 'ff_amp': [32767, 32767, 32767, 32767],\n", + " 'fm_amp': [32767, 32767, 32767, 32767],\n", + " 'bias': [1, 2, 3, 4],\n", + " 'fm_en' :False, #nco_fm的开关,在nco_fm模式时,必须打开,不然nco_fm不工作,就是一条直线. mod的模式下开启fm_en,同时打开nco,就能看到两个正弦波叠加啊\n", + " 'instr_type': 'general_send_wait', #调用汇编搬移上面的数据到mcu_regfile,同时配合下面参数执行指令.AWG固定用这个模板,不用改。\n", + " 'send_interval': [100, 150, 200, 250, 300, 350, 400,450,500],\n", + " 'cycle_num': 1, #0代表无限循环,如果要想扫参,那么这个波形序列就不能无限循环播放\n", + " 'codeword_configs': [\n", + " # {'wave_hold': 1, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 0},\n", + " # {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 0, 'env_index': 1},\n", + " # {'wave_hold': 1, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 2},\n", + " # {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 0, 'env_index': 3},\n", + " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 4},\n", + " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 5},\n", + " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 6},\n", + " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 7},\n", + " {'wave_hold': 0, 'fcw_index': 0, 'pcw_index': 0, 'code_clr': 1, 'env_index': 8},\n", + " ], \n", + " 'sweep_config': {\n", + " 'sweep_num': 0, # 外层循环:如果是0,则代表不扫参,该部分无效,只搬移一次的23个寄存器。如果是 1,代表重载1次寄存器(加上最初的那次,共两次).\n", + " 'offsets': [0x78, 0x40], # 告诉硬件:本次扫描要修改哪几个寄存器的偏移地址,比如要重载2个寄存器,0x78 = AMPR0 (幅度), 0x40 = CWFR0 (频率) \n", + " 'steps': [3000, int(100 / fs / 4 * 2 ** 32)] # 幅度每次 +3000;频率每次 100MHz (支持负数,Python会自动转32位补码给MCU) ,所以第一次载入是载入初始值,第二次就是原值+steps,第三次就是上一次的值+steps \n", + " },\n", + " 'envelope_configs': [ #包络配置\n", + " {'envelope_type': 'rect_hold', 'amp': 32767},\n", + " {'envelope_type': 'flattop_hold', 'amp': 32767, 'edge_time': 3.5, 'wave_time': 30},\n", + " {'envelope_type': 'acz', 'amp': 32767, 'wave_time': 12 * 4},\n", + " {'envelope_type': 'accz', 'wave_time': 12 * 4},\n", + " {'envelope_type': 'cosine', 'amp': 32767, 'wave_time': 12 * 25},\n", + " {'envelope_type': 'rect', 'amp': 32767, 'wave_time': 12},\n", + " {'envelope_type': 'flattop', 'amp': 32767, 'edge_time': 2, 'wave_time': 22},\n", + " ],\n", + " 'FolderName': 'General',\n", + " 'CaseName': 'env2',\n", + "}\n", + "run_case(param_ch0)\n", + "\n", + "#通道1\n", + "param_ch1 = param_ch0.copy()\n", + "param_ch1['channel'] = 1\n", + "param_ch1['fcw'] = [200, 200, 300, 400]\n", + "run_case(param_ch1)\n", + "\n", + "#通道2\n", + "param_ch2 = param_ch0.copy()\n", + "param_ch2['channel'] = 2\n", + "param_ch2['fcw'] = [300, 200, 300, 400]\n", + "run_case(param_ch2)\n", + "\n", + "#通道3\n", + "param_ch3 = param_ch0.copy()\n", + "param_ch3['channel'] = 3\n", + "param_ch3['fcw'] = [400, 200, 300, 400]\n", + "run_case(param_ch3)\n", + "\n", + "\n" + ], + "id": "3e79e12a64f2769e", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "执行 config_chip_reg\n", + "执行了 env_config\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n", + "执行 config_chip_reg\n", + "执行了 env_config\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n", + "执行 config_chip_reg\n", + "执行了 env_config\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n", + "执行 config_chip_reg\n", + "执行了 env_config\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt\n" + ] + } + ], + "execution_count": 40 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-28T09:50:35.917889Z", + "start_time": "2026-07-28T09:50:35.900732Z" + } + }, + "cell_type": "code", + "source": [ + "# RAMP 通用模板1\n", + "#RAMP SPI控制\n", + "param_ch0 = {\n", + " 'channel' : 0,\n", + " 'chip_mode': 'RAMP',\n", + " 'ramp_ctrl':'SPI',\n", + " 'fixed_enable': True, #是固定值还是斜坡模式\n", + " 'fixed_value': 22767, #固定值模式生效\n", + " 'height': 512, 'step_time': 34 , #斜坡模式生效 ,step_time就是台阶宽度\n", + " \n", + " 'FolderName': 'RAMP',\n", + " 'CaseName': f\"RAMP_SPI\"\n", + "}\n", + "run_case(param_ch0,write_hw = True)\n", + "\n", + "#通道1\n", + "param_ch1 = param_ch0.copy()\n", + "param_ch1['channel'] = 1\n", + "run_case(param_ch1,write_hw = True)\n", + "\n", + "#通道2\n", + "param_ch2 = param_ch0.copy()\n", + "param_ch2['channel'] = 2\n", + "run_case(param_ch2,write_hw = True)\n", + "\n", + "#通道3\n", + "param_ch3 = param_ch0.copy()\n", + "param_ch3['channel'] = 3\n", + "run_case(param_ch3,write_hw = True)\n" + ], + "id": "1f6f70a26d5da7f8", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "执行 config_chip_reg\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n", + "执行 config_chip_reg\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n", + "执行 config_chip_reg\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n", + "执行 config_chip_reg\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_SPI_HEX.txt\n" + ] + } + ], + "execution_count": 36 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-28T09:26:33.012700Z", + "start_time": "2026-07-28T09:26:32.989301Z" + } + }, + "cell_type": "code", + "source": [ + "#RAMP MCU控制时,斜坡模式\n", + "param_ch0 = {\n", + " 'channel' : 0 ,\n", + " 'chip_mode': 'RAMP',\n", + " 'ramp_ctrl':'MCU',\n", + " #是固定值还是斜坡模式,如过是斜坡模式,则要指令选ramp_step\n", + " 'instr_type': 'ramp_step', #可选ramp_step或ramp_fixed. mcu执行不同指令操作模板,实现台阶或斜坡这两种模式\n", + " 'ensemble_num' : 2, #大循环次数\n", + " 'param_num' :2, # 循环中参数个数,和列表个数一致\n", + " 'height': [128,256], \n", + " 'step_time': [50,50], \n", + " \n", + " 'FolderName': 'RAMP',\n", + " 'CaseName': f\"RAMP_MCU_STEP\"\n", + "}\n", + "\n", + "run_case(param_ch0,write_hw = True)\n", + "\n", + "#通道1\n", + "param_ch1 = param_ch0.copy()\n", + "param_ch1['channel'] = 1\n", + "run_case(param_ch1,write_hw = True)\n", + "\n", + "#通道2\n", + "param_ch2 = param_ch0.copy()\n", + "param_ch2['channel'] = 2\n", + "run_case(param_ch2,write_hw = True)\n", + "\n", + "#通道3\n", + "param_ch3 = param_ch0.copy()\n", + "param_ch3['channel'] = 3\n", + "run_case(param_ch3,write_hw = True)" + ], + "id": "84e2c612b0a8f7ab", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "执行 config_chip_reg\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n", + "执行 config_chip_reg\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n", + "执行 config_chip_reg\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n", + "执行 config_chip_reg\n", + "执行了 instruction_config\n", + "生成文件路径:D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\RAMP_MCU_STEP_HEX.txt\n" + ] + } + ], + "execution_count": 26 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-28T09:51:30.781841Z", + "start_time": "2026-07-28T09:51:30.762192Z" + } + }, + "cell_type": "code", + "source": [ + "#RAMP MCU控制时,固定值模式\n", + "param_ch0 ={\n", + " 'channel' : 0,\n", + " 'chip_mode': 'RAMP',\n", + " 'ramp_ctrl':'MCU',\n", + " #是固定值还是斜坡模式,如果是固定值模式,则指令选ramp_fixed\n", + " 'instr_type': 'ramp_fixed', #可选ramp_step或ramp_fixed. mcu执行不同指令操作模板,实现台阶或斜坡这两种模式\n", + " 'fixed_value': [1<<15] + [1<<15 | 1<> 16) + ((last_env_idx & 0xFFFF) << 1) + return env_base_addr << 16 | envelope_length + + def _env_data_pack(self, float_data_array): + data_int = np.round(float_data_array).astype(int) + data_int[data_int < 0] += 65536 + hex_pairs = [] + for data0, data1 in zip(data_int[::2], data_int[1::2]): + hex_pairs.append((data1 << 16) | data0) + + return hex_pairs + + def _generate_envelope_batch(self, **kwargs): + kwargs_copy = copy.deepcopy(kwargs) + channel = kwargs_copy.pop('channel') + envelope_configs = kwargs_copy.pop('envelope_configs', []) + env_data_mem = [] + env_idx_mem = [] + idx_num = 0 + for envelope_config in envelope_configs: + envelope_type = envelope_config.pop('envelope_type') + env_data = self._generate_envelope_data(envelope_type, **envelope_config) + if isinstance(env_data, tuple): + retun_param_count = len(env_data) + else: + retun_param_count = 1 + if retun_param_count == 1: + envelope = env_data + envelope_arr = np.asarray(envelope, dtype=float).reshape(-1) + if envelope_arr.size % 4 != 0: + raise ValueError("Envelope length must be multiple of 4") + env_data_mem += envelope_arr.astype(int).tolist() + envelope_length = int(envelope_arr.size) + current_env_idx = self._next_env_idx(idx_num, env_idx_mem, envelope_length) + env_idx_mem.append(current_env_idx) + idx_num += 1 + elif retun_param_count == 2: + rising_edge, falling_edge = env_data + rising_edge_arr = np.asarray(rising_edge, dtype=float).reshape(-1) + falling_edge_arr = np.asarray(falling_edge, dtype=float).reshape(-1) + if rising_edge_arr.size % 4 != 0: + raise ValueError("Envelope length must be multiple of 4") + env_data_mem += rising_edge_arr.astype(int).tolist() + rising_edge_length = int(rising_edge_arr.size) + rising_edge_idx = self._next_env_idx(idx_num, env_idx_mem, rising_edge_length) + env_idx_mem.append(rising_edge_idx) + idx_num += 1 + env_data_mem += falling_edge_arr.astype(int).tolist() + falling_edge_length = int(falling_edge_arr.size) + falling_edge_idx = self._next_env_idx(idx_num, env_idx_mem, falling_edge_length) + env_idx_mem.append(falling_edge_idx) + idx_num += 1 + + env2mem_format = self._env_data_pack(env_data_mem) + + ENVI_BASE = addr_base['ENVI0_BASE'] + channel*0x600000 + ENVM_BASE = addr_base['ENVM0_BASE'] + channel*0x600000 + self.write_register(ENVI_BASE, env_idx_mem) + self.write_register(ENVM_BASE, env2mem_format) + + +def env_config(mk_instance, **kwargs): + env_gen = EnvelopeGenerator(mk_instance, **kwargs) + env_gen._generate_envelope_batch(**kwargs) \ No newline at end of file diff --git a/4ch-Z_Generator/FourChZreg_define.py b/4ch-Z_Generator/FourChZreg_define.py new file mode 100644 index 0000000..14df843 --- /dev/null +++ b/4ch-Z_Generator/FourChZreg_define.py @@ -0,0 +1,279 @@ +# TODO: 寄存器统一由excel表格维护 +# TODO: 寄存由excel表格生成 +FourChZreg_define = { + 'sys_reg': { + 'IDR': 0x00, + 'VIDR': 0x04, + 'DATER': 0x08, + 'VERR': 0x0C, + 'TESTR': 0x10, + 'IMR': 0x14, + 'ISR': 0x18, + 'SFRTR': 0x1C, + 'SFRR': 0x20, + 'CH0RSTR': 0x24, + 'CH1RSTR': 0x28, + 'CH2RSTR': 0x2C, + 'CH3RSTR': 0x30, + 'DBGCFGR': 0x34, + 'MISR': 0x40, + 'SYNCR': 0x44, + 'MSDENR': 0x48, + 'MSDPCNTR': 0x4C, + }, + 'ctrl_reg': { + 'MCUPARAR0': 0x00, + 'MCUPARAR1': 0x04, + 'MCUPARAR2': 0x08, + 'MCUPARAR3': 0x0C, + 'MCURESR0': 0x10, + 'MCURESR1': 0x14, + 'MCURESR2': 0x18, + 'MCURESR3': 0x1C, + 'RTIMR': 0x98, + 'ICNTR': 0x9C, + 'FSIR': 0xA0, + 'MODMR': 0x100, + 'MODENR': 0x104, + 'MODDOTR': 0x108, + 'MIXODFR': 0x10C, + 'STR': 0x110, + 'NCOAOR': 0x114, + 'SPI_RAMPFIXR': 0x118, + 'SPI_RAMPSR': 0x11C, + 'SPI_RAMPIFSR': 0x120, + 'SPI_RAMPENR': 0x124, + 'TSTIMER': 0x130, + 'TSITVLR': 0x134, + 'TSENR': 0x138, + 'TSVALR': 0x13C, + }, + 'mcu_reg': { + 'CWFR0': 0x40, + 'CWFR1': 0x44, + 'CWFR2': 0x48, + 'CWFR3': 0x4C, + 'CWPRR': 0x50, + 'GAPR0': 0x54, + 'GAPR1': 0x58, + 'GAPR2': 0x5C, + 'GAPR3': 0x60, + 'GAPR4': 0x64, + 'GAPR5': 0x68, + 'GAPR6': 0x6C, + 'GAPR7': 0x70, + 'LCPR': 0x74, + 'AMPR0': 0x78, + 'AMPR1': 0x7C, + 'AMPR2': 0x80, + 'AMPR3': 0x84, + 'BIASR0': 0x88, + 'BIASR1': 0x8C, + 'BIASR2': 0x90, + 'BIASR3': 0x94, + 'RTIMR': 0x98, # Note: Same as in ctrl_reg + 'ICNTR': 0x9C, # Note: Same as in ctrl_reg + 'FSIR': 0xA0, # Note: Same as in ctrl_reg + 'DCBVR': 0xA4, + 'FMER': 0xB4, + 'MCU_RAMPFIXR': 0xB8, + 'MCU_RAMPSR': 0xBC, + 'MCU_RAMPIFSR': 0xC0, + 'MCU_RAMPENR': 0xC4, + 'PRNGSDR': 0xC8, + 'PRNGRESR': 0xCC, + 'MULTR0': 0xD0, + 'MULTR1': 0xD4, + 'DTFR': 0xD8, + }, + 'tc_reg': { + 'TCPARR0': 0x000, + 'TCPARR1': 0x004, + 'TCPARR2': 0x008, + 'TCPARR3': 0x00C, + 'TCPARR4': 0x010, + 'TCPARR5': 0x014, + 'TCPARR6': 0x018, + 'TCPARR7': 0x01C, + 'TCPAIR0': 0x020, + 'TCPAIR1': 0x024, + 'TCPAIR2': 0x028, + 'TCPAIR3': 0x02C, + 'TCPAIR4': 0x030, + 'TCPAIR5': 0x034, + 'TCPAIR6': 0x038, + 'TCPAIR7': 0x03C, + 'TCPBRR0': 0x040, + 'TCPBRR1': 0x044, + 'TCPBRR2': 0x048, + 'TCPBRR3': 0x04C, + 'TCPBRR4': 0x050, + 'TCPBRR5': 0x054, + 'TCPBRR6': 0x058, + 'TCPBRR7': 0x05C, + 'TCPBIR0': 0x060, + 'TCPBIR1': 0x064, + 'TCPBIR2': 0x068, + 'TCPBIR3': 0x06C, + 'TCPBIR4': 0x070, + 'TCPBIR5': 0x074, + 'TCPBIR6': 0x078, + 'TCPBIR7': 0x07C, + 'TCBPR': 0x080, + 'TCCER': 0x084, + 'TCOVR': 0x088, + 'TCCDR': 0x08C, + }, + 'pll_reg': { + 'INTPLL_REFCTRL' : 0x00, + 'INTPLL_PCNT' : 0x04, + 'INTPLL_PFDCTRL' : 0x08, + 'INTPLL_SPDCTRL' : 0x0C, + 'INTPLL_PTATCTRL' : 0x10, + 'INTPLL_SELCTRL' : 0x14, + 'INTPLL_VCOCTRL' : 0x18, + 'INTPLL_TCCTRL' : 0x1C, + 'INTPLL_AFCCTRL' : 0x20, + 'INTPLL_AFCFBCTRL': 0x24, + 'INTPLL_AFCLDCNT' : 0x28, + 'INTPLL_DIVRSTSEL': 0x2C, + 'INTPLL_TESTCLK' : 0x30, + 'INTPLL_DIGCLKSEL': 0x34, + 'INTPLL_STATUS' : 0x38, + 'INTPLL_SYNC' : 0x3C, + 'INTPLL_UPDATE' : 0x40, + 'INTPLL_CLKRXPD' : 0x44, + 'INTPLL_RESV' : 0x48, + 'CCALRSTR' : 0x4C, + 'CCALATENR' : 0x50, + 'CCALSELALNR' : 0x54, + 'CCALDCCQECR' : 0x58, + 'CCALQECCT0R' : 0x5C, + 'CCALQECCT1R' : 0x60, + 'CCALDCCCT0R' : 0x64, + 'CCALDCCCT1R' : 0x68, + 'DIVSYNCDCR' : 0x6C, + 'SYNCCLRENR' : 0x70, + 'CCALDCCCT2R' : 0x74, + 'CCALSTR' : 0x78, + } +} + +# Usage example: +# value = reg_define['sys_reg']['DATER'] # Gets 0x00 +# print(f"IDR value: {value}") +# import reg_define + +# 预定义的TC系数组 +TC_COEFFICIENT_SETS = { + 'default': { + 'amp_real': [0.025, 0.015, 0.0002, 0.2, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-1/250, -1/650, -1/1600, -1/20, 0, 0, 0, 0], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': '默认TC系数组' + }, + 'coef1': { + 'amp_real': [0.025, 0.015, 0.0002, 0.2, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-1/250, -1/650, -1/1600, -1/20, 0, 0, 0, 0], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': 'lsw - coef1' + }, + 'coef2': { + 'amp_real': [0.025, 0.015, 0.0002, 0.2, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-1/250, -1/650, -1/1600, -1/20, 0, 0, 0, 0], + 'time_imag': [0, -1/300, -1/500, 0, 0, 0, 0, 0], + 'description': 'lsw - coef2' + }, + 'coef3': { + 'amp_real': [0.025, 0.009, 0.0002, 0.2, 0, 0, 0, 0], + 'amp_imag': [0, 0.012, 0, 0, 0, 0, 0, 0], + 'time_real': [-1/250, -1/650, -1/1600, -1/20, 0, 0, 0, 0], + 'time_imag': [0, -1/300, -1/500, 0, 0, 0, 0, 0], + + 'description': 'lsw - coef3' + }, + 'coef4': { + 'amp_real': [0.025, 0.015, 0.0002, 0.2, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-1/250, -1/2000, -1/1600, -1/20, 0, 0, 0, 0], + 'time_imag': [0, -1/15, -1/50, 0, 0, 0, 0, 0], + 'description': 'lsw - coef4' + }, + 'coef5': { + 'amp_real': [0.0281, 0.0024, 0.0021, 0.0011, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-0.0033, -0.0027, -0.0027, -0.0002, 0, 0, 0, 0], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': 'czy - coef5' + }, + 'coef6': { + 'amp_real': [0.0314, 0.0132, 0.0055, 0.0017, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-0.0096, -0.0021, -0.0009, -0.0002, 0, 0, 0, 0], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': 'czy - coef6' + }, + 'coef7': { + 'amp_real': [0, 0.0282, 0, 0.0130, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-0.0193, -0.0051, -0.0012, -0.0020, 0, 0, 0, 0], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': 'czy - coef7' + }, + 'coef8': { + 'amp_real': [0.0314*1, 0.0132*1, 0.0055*1, 0.0017*1, 0.0282*1, 0.0130*1, 0.0024*1, 0.0021*1], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [-0.0096, -0.0021, -0.0009, -0.0002, -0.0051, -0.0020, -0.0027, -0.0027], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': 'thfu - coef8' + }, + 'coef9': { + 'amp_real': [0.0314*1, 0.0132*1, 0.0055*1, 0.0017*1, 0.0282*1, 0.0130*1, 0.0024*1, 0.0021*1], + 'amp_imag': [0.012, 0.012, 0.012, 0.012, 0.012, 0.012, 0.012, 0.012], + 'time_real': [-0.0096, -0.0021, -0.0009, -0.0011, -0.0051, -0.0020, -0.0027, -0.0027], + 'time_imag': [-1/300, -1/500, -1/15, -1/20, -1/100, -1/200, -1/400, -1/800], + 'description': 'thfu - coef9' + }, + 'custom': { + 'amp_real': [0, 0, 0, 0, 0, 0, 0, 0], + 'amp_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_real': [0, 0, 0, 0, 0, 0, 0, 0], + 'time_imag': [0, 0, 0, 0, 0, 0, 0, 0], + 'description': '自定义系数组 - 需要手动设置' + } +} + + +#### regfile base address #### +addr_base = { + 'SYST_BASE': 0x00000000, + 'DBGM_BASE': 0x01900000, + + 'ITCM0_BASE': 0x00100000, + 'DTCM0_BASE': 0x00200000, + 'CTRL0_BASE': 0x00300000, + 'TCCO0_BASE': 0x00301000, + 'ENVI0_BASE': 0x00400000, + 'ENVM0_BASE': 0x00500000, + 'CLK0_BASE': 0x01F00000, + 'DAC0_BASE': 0x01F01000, + + 'ITCM1_BASE': 0x00700000, + 'DTCM1_BASE': 0x00800000, + 'CTRL1_BASE': 0x00900000, + 'TCCO1_BASE': 0x00901000, + 'ENVI1_BASE': 0x00A00000, + 'ENVM1_BASE': 0x00B00000, + 'CLK1_BASE': 0x01F02000, + 'DAC1_BASE': 0x01F03000, + + +} + +# 共用是SYST_BASE 基地址,前5个地址其实就是偏移地址夹600000,后面两个其实是加1000 + + +fs = 750 #MHz \ No newline at end of file diff --git a/4ch-Z_Generator/ParamsManager.py b/4ch-Z_Generator/ParamsManager.py new file mode 100644 index 0000000..d70040c --- /dev/null +++ b/4ch-Z_Generator/ParamsManager.py @@ -0,0 +1,56 @@ +import json +import os +from pathlib import Path + + +class ParamsManager: + + def __init__(self, params_dir='params'): + self.params_dir = params_dir + self._ensure_dir_exists() + + def _ensure_dir_exists(self): + Path(self.params_dir).mkdir(parents=True, exist_ok=True) + + def save(self, params, filename): + if not filename.endswith('.json'): + filename = filename + '.json' + + filepath = os.path.join(self.params_dir, filename) + + with open(filepath, 'w', encoding='utf-8') as f: + json.dump(params, f, indent=2, ensure_ascii=False) + + def load(self, filename): + if not filename.endswith('.json'): + filename = filename + '.json' + + filepath = os.path.join(self.params_dir, filename) + + with open(filepath, 'r', encoding='utf-8') as f: + params = json.load(f) + return params + + def save_multiple(self, params_dict): + filepaths = [] + for filename, params in params_dict.items(): + filepath = self.save(params, filename) + filepaths.append(filepath) + return filepaths + + def load_multiple(self, filenames): + result = {} + for filename in filenames: + result[filename] = self.load(filename) + return result + +# from ParamsManager import ParamsManager + +# # 创建参数管理器实例 +# pm = ParamsManager('params') # 参数保存在 params 文件夹中 + +# # 保存单个参数 +# pm.save(params, 'AWG_NCO') # 自动添加 .json 后缀 + +# # 加载单个参数 +# params = pm.load('AWG_NCO') diff --git a/4ch-Z_Generator/__pycache__/FourChZAssemblyTemplateManager.cpython-311.pyc b/4ch-Z_Generator/__pycache__/FourChZAssemblyTemplateManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d6c9a2a6316d4586c036f9126cbd5d39270cee1 GIT binary patch literal 13773 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 literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/__pycache__/FourChZEnvelopeGenerator.cpython-311.pyc b/4ch-Z_Generator/__pycache__/FourChZEnvelopeGenerator.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce9eb69cb7dc48eb10a27d7ae53ed955f4526150 GIT binary patch literal 12585 zcmd@)TWlNIbwhGUj`$EMQ4;mEXv&gITef9OmgT2x+45^8dDpUcQ?54*%^69w`OpqW zesHNkNH>kLa1&+W*7Cx^vaNTcz?;+ox~NcKTLW!S|FoT92M{x;iY?OZ)+kyia35$s znx1oquOTh(E}G=0!{NDi?mhQ)?z!ilbMF0~-EN`a`8V(MmA`7IsGs6T{-JY`r+*5O zI}}T?x(Mahkx=i~lhEKdkdXG%Bs4}%ezQ)+W&8}J=_6H9i{BEp`mIr$-xjs|?a^v~ zb=2W^5IjS~8LjcxkT@Nwjk^3U5;sQbqV@iI5;sK}qHe#N#Lbb$Xp_H*#FKCXV||is4x7rb3?xhXjQl4JQPJIX5GO zY7M|&Lve(Pe*Hyiit-ycnlm;PusIW}I|N@-K)K)7`OOd- zAY@pYHL@nw%rfw+VlD8q-ZQecdq#g1YbW2;Y&Gk+N3%}0=AOZCVQXRZR@Md3#?}F} zv-JS0*#>|P)(z0fHUg|+n*i3b%>Z3&3&1+I6<|Hv2C#wM1kla40~I|=%}DGT7m3es zr??o$2ZcDVSOUQtTp|zwTKX8pG&MC7i3^J1a&%g8Oop#Cp>7Ot_$|oiSe+MAx%2#=XXu^b@_N{$m-sQ^aq7JC{w7DrC@&b4D zE}e|e^2ewB6`Zzn=BB~~py99(2qc>;^YeK~(?kb=c`94mwm{!9XInPEd*Gb|>8RAw zFSqnB&@$5~lJ_Z~Q6cPm{y}cR@26)00BNZ!`5bB^vI6<_fL9>q`ye_WkrXv!{}%W~hv?>3>4x3lUY9h7y$zTgj#yVH(O9nifg~iGUoLds1a} zYVyiz(d5zE7Fb#5 zR+xp{^FD+R@*mWkNvJA(P*(~poie6OSIK@?#-Jst?3_7eW=p>r_%;<)-MOlik)=`$ zYfeHFU)Pu9SfKtYmeHhHQPE%wU8cK)&e#L9Ae)DR5XQsYW zs_&NTyB92LuKL@9OQXwYGpz%XYoF}ex1y6>2Nsy@rmpns_pZW9&2IKBd+)c3%%<$7 zZQ}OhV$aZ{%~H>Ch{~HzAVT|gv1jntJChKHndjvaJ5W%wfx4{@K(Ubw51y56SyO6}p=Xiau=xa0e<%QLk0a=~B9) zF8dw*Ez1P;eG05qn&*NMpI*`L>{SfF>Iq!fIYsK{mP2USh2qhfBgsS0<1;Xe3u?j6 zLy>q0Dmns@d}&-xiDm%vl-M|+zUk1C>t18wlT4mZudZ2~v&vnHY)}lgg({+A&&NQ^ zgZ9ezs)pjqDeYcz>*pQFIqbBbbo#S(z%^I%QeV1ix$mLj;lxVkqq;}4k6FnzA-g7k z!O57HzXXGo8VBUYfdzZk0bJf%$+0M93CCW5$QR*QEg!Oa*6;!SK1lfo1xXJ&w?S1H z2!pBY^knEHn0C4gitd;~qxGJj0u)DJt)jlBYThdKx!AP;dOi{~WT2p`P`Qa;1ki}9 z;Q1=I2K8mAFoA{(h^2}R-_^QwbNTo~PIMiTT!&=WAt0*5z2K-Mpc!f)1oVH#)(*NJ z@Osf_^c>^GAdu}2YKEu8)YFzXY-s$HX>wrj=+dOFa=;q3Tk4##bXu!vp&W1adw=GNi(#Ircm+b6XFcud3 zd;0rEsk%$9?gFFlGp)e28rSWnrTtP(r(DyyTqV`)UNB`FnwDNl*Z-jQgNBE?4~PF~ z_K@9Vy$n=>rxVhw<)*I*V5{W470B3MHXvzpXdXulLQ_OF0P zYw!wuslodR;2AY|MP4lFW9-L(ms2QtwOt%5c{KI?2=L6B`cULo;(ZtJm>ixP{9z~& zDjv3KiYi8Xg~oiGqCT)|`<=EI^NKOHTHA+obuq6PD^o+%4Z=B&S^@aTRSyg5j;i%ounjQ@ zoHe1OLZb**OzQeloai~k-IxuqVNyi{cLN+&;9xJP2LU!H1QmM`Q@8;wk&jIi`_%j$EM}T`Je;Gjp0goVs06jR0(+*4?)#$nHMTeHh+{lWMqd z`kSY-_U5Il8M{xk`?BsqL>d&`!|<*Qs9_!{oUwO{_U^2E0FfZ`D7-5TYPfKEfz%Ys z*n32KPu6`9kq(OP5qMXiISlhiT*lrZ+B>rDJ&3eNbRUBE;mc~6N1Dvow}|#F8+BZ5 zZaQP{675}CcMsOoBVxA(manN{t|oC)Z^qs$+IzF^wmZqUlcM*)%CO`flHEi3w&EH4 z4$;0N+qmgn%R83zL8)<<+_-Du47%qWp0x&#xOqTo*e5sa6P^1$aW~ygrhSsT2U=V> zy+%H_e%L9x2PO9)kZ;v}G~+({s8({HkliO%-7jR^FG%h&**ylGE~+5~@dguyA`$;j zkwG=$8f=6K5YTL?%?l!gH6+1KfRIkYRI|n;l*Wx0-8_&7U*IhTQ3hMDXj{OO z4YagEJXLn`kuL0NP`dC4g}tO)0|LDeez4mT+#C8EB@+jZS&+UVLr9M<^eJl2Q0g*) zQg|9__`0F!-hebbE!CuH<@pKfH4pCbb2Lo7Azj!D3tfc>umoX{6pbvQmGnC5)@GvU z=h!4nQ96ph2BlOEL52a_ibz5uAD@K-EfX*RNLR%Wj=||&GCTt*Gc(}Z$k|{Z*wJrD zBwT<{Wx^6|7TDxQ3LQ35Kpd>l8za@mtW-#61A> z6!9I1tv!-!hwR$1>gvz9`ahhIT>E9$elP_X=VIg1vA5B20I$q!N_R?3xB4Z4Goh|w zp=zzQJF^xV@0<@uk2o-KlrNDdPHtLvQFu$`U&{v=)%b2-mI;D)z+G^ zwJvdK{_fS~i&EPj$<`;^`b6@6yn(A9If+;x5s2NPJ|9;impz*^D-K!U=wt&-eT7a# z15X;^Z(g`Ae9Y+70Ti`6bltO4a@!X1(^;H0vdO)XvUa z-E(KXu58xpH=Ol)ZM~(l4&3efHI36%oC|G#<{F+m&W5sax;GrBTU&4GI2ZM|z7DOF zNRpCOQRZ8jYZSVQxvaG)9>Cda%lk*>nlxDU4X~P_)w*JB#aOB-RVK@zzZ>B;ry8|# zFL%wLdR#Gwrh~B<++A@N)I9Z8M?%#ZzYR^QdcXq4hzj`v#FCwPP0pjLg`VhaLhxMX zAdCp%nF!~JPkQ=^9-&x9#$P_u8yG$|F#_7fSHQ%AgfTV2SFg~aI9}IaIc^4Hsu$>O zXhgB#>2vPxh*6k@S``B{N0br%7Ix@7g5O458gI_gCB>>KY3o9?YUuYK7)UaJ{*bdIH+O|8p z-rfbaS#6J8+p_?ddAi;mdS^)7et3nKT88D8VZ1QlZi1uUhDOA90Z#j_b;?uK_A>+v z=d!KaS6g>wT6aBkNUcZZ)}vrqCOS96`|*}efLVtpeJtbX6dj$}mX1Yct$p*o!I>q**Qu|T4{pf1@ z=}i0S$F)-XsN6ofXv@0VW!IMU>ym5h^0AC-hv?d|*1SdR9F>~K;doOu|?aOw=*4)yY@-mLD@UF=*W7zR=xchZ~wzr zR<1rClDx0V-d7>n*|O^NW}M#ikmT%>oqeLSFY9zK?f#B!(fl2Aw#J(dW@@^nn(k~* zzvT2ST9+=ZdAHo(w*2akjiUFYbM|xTo9ceuZjH_34^*&>mj#bY<#xw9? zLh>AxJqK4k!x_)8iu19bdt*<*6!m^hwTs+1W2T`wL|K?~j|>R-1Y!{7vbY<%svhACf&#!nN>%|K% zi*>KSyKXf#Lva8i-LPIuIbAuNN0-IAGw^~Vf89(s0S*9>u3xw5jeFOr0$_B;Aut{D zz(gCH05uP6w6PCAbHHXawyskJP;E8tU#AM7*=TIT+#IMj7#m?=d0;UcTh^%psBOfI z0_ZnkuL{6v#vT+v?M~yqb*d7mlt-d#4w8{$h#h+XB3e5(MG-qtN9;g7*ogX~zlB8$ zk>nIEKdN3Sy*jTr;czKw5CU?rsF-0lz->f(=h1?xxn1~g0QV96b2swVs@v06v3dYr z@C=f0{#2IUGJi^@w}|vkc+=O^umH&zeQk;n{9&L95buXRo>0ISJT(RGW*$v3r3SV` zJOqt|FT;&fa+%qb3k@?7@QoyHCcr&>a|TPGy~xuDkWxGtkra;}DISegh323o9$b2= zR)GWDnY;I)deezh4pYI8&Lf?P%0}?WxhQ1ucnGUlik;%oj#g@Nw`AcyXn^G=;dD%; zERv~gDgB%|qzZ*2{NF<^I>i#*0M`vVoi0n&iupH7Rn3!Mma3j7zbs{)C%-J!E^6N_ zWtk_xkEz4r7kRT(y{LV&REMa2pVeHKNNL_@;S@W$Zi?u2!0FG1KO^b?UYh%5qh1F( JLnR+dB=}z%a(kC?AmVPG--Wz(xi3dBPkWgwsNGnsY!8Ne~#ml+hn_t zaA^wZnqFWUDQg-$T1pEI+d>%y3Qa3ESXWjk8Zc1BrS2tB4&B&c9c=4h@c)139Lc%u z$>!%gfBoL~yS04xEH^|6>GO~AwCd_}Q2tfzL zAaqECp<9Ipjfg08n;3@PD7Hgy5+l%ei5<|J#k--S;uh$bxD`4s#8GBBA$G!=6uY2P z;x_1e#BS&wu@`z_PW!}u`2R@6pwnUoIxB96zE`{tdO#e6zF&L*`a$s_=pEwFQPfl1 zDLyPdGM6WFJ1i@Em#pj`%gWv@D|vU(58>OCT>_i0(Z zM`iUsBdhnAtls0YdY@(W#OGK$cbNefq+ew+*7i4Zv z%G|yvbNg$V+m~c+Ps!ZAEOYyc%Zh{5KNCMk|6dXF&{xH4(AUKq(9_}! zG$YPJb@2=6o8q6L{~~?~{a0Z?e!u}Hn4P2<95%W9X_YRl@7)>_NzlvbOxeEnP0z!pvK zqE#@!b2by5k(&lpP4|%t2O>WIpr+qI!v!O(4&tZ~P4|GhE$r32T3Zg=bJ&r?PApZo zY5oYN+SHz5oYFz>p796qdITjPRxkXcWQl4Mnvn zmuUsJ5BUPxRH^I(3N%$Imkg>y-XU$O7RJ7uNsY=X49(xs7ba8&aS zgag6tTDsV_B3f=F7=Tq`k07jcQ8a>d{1SrE;gFVgMk5?3j7EmNG}RjesEPb&H$OVe z50pZ^F^nFEWzJi?VXaM%X1QJ8p5+dGN0vMFTe94xi!68RyRzJ)@6K|szMotWQp1`) zBi+amN4+o0?fM6@+@T-Ja;JWnT-YDyf%bHPFB)LWR9tQ}$AWenI&A2)q05GD8+vT$H6dv46V$AI zf||8YP_y<4YSunM&DtlZ_2}yvvJ4@p_3E2!tKW_cVD1PocLbO_0?Zu&=8ga}GJqLb zza1IC+Q*Iz9%~;vGI*?g5Sa`Lo?hH(wLi?Ot*U+vbp#9zo3>9&mj?%<;ZSH)^9R(Z z7D|^`HeV#!!EnGQ2kps`uxVG=lcV0~xfA@MbL?StNZMuA0>r|@?ESm})2_6JVF&u< z4EqFlLOzCMPw@qZ@ve;cbDQw>tcKpXV8#}hoME3DL73Yj*%bL6&5msg^R3@no{b4> zwe4YFb~bM4aN4D+crV~(m3EV`0&j~FBF^!KY{RFjTm7mv0#c)G3ypTmz_i?mG%!+( z%ov#u>x&6$NXwogCw1WV%Oj&&t213RePDVtHZhrYjnBk(ODftkJ}aScX54h_-z`U4 zU76z#$)CQ-r&rwd=GLb_)|XkQE_?H}o;7{e(6{?y`MAdCNvrET$0bdi@!J!>`u@PJ z`xBFA)_(Gi=eur7WZqwUa?7g+eF^J~6N!s0pRK~V`ZLGQo_s8-X1?^ynNK{KdFC)u zbdBxVk37b9n>4j&Y%=Yhnc6d9I!%<`5-~A79-G=fGqrE;!IIt6?`>GuFureMXS)@D zW~lz`Q+E!&Ct<~S%S8i`!7W_gf#okExXF#L41M&$y&vw2@l_T3?uB)dOYOtn{?Kiw zW{w`YXhCxYSa?t;mcGP;%o1)+#JrruCcz!YxaJ|amuM(Gc);pNH|~i%vgVP#jJel+eVMNZOY^R}`}V%fXwgecwx-{8iNmdE zKa#McO=Ld);vF|6J~)tw{p=F8T6lPmUAW&j{_Z!k^K<4gnGH|9aQkx)-+PHeCm$c& zTr>8~qlwIsyGDL+>h+n#q*=5`BKG6UIJ6gs{+#n(q0CcWrJSamp`!R#Mp&wiQ28)@CP!}hg9 zLCpInY=|b#iEqQ~Dl9vD_vcTaJpRVl?#X_|5xzcm=8ilK*_gU(1ixHH(TSU=-kH7Kk z+>Vj6_kJOB&)u2hhsUub^T5Mrj>Jzt^u&&?@m=diMz>7torsOi?2GNV;Pk8aA9&lf zY0o|}yL;mL82@j;qfDQ0D~gfta5xNCO=V%qRd!^?$Op~4%Hsuw6J!)B?#g(rQABnr z?h5$b%%^Hms=ChT&Pt z$@ax1qlMhFk&G6So5%_UEu^D`j24ntk$?M2yA^93IT1ajuqlM&7 zGFnLPCZmPqUNTxp-atkR$s5UNA^AEoT1f6An=R}%&_Y;jA-}w6AuP6#7Fq~PriB(( z*Wqi(7TP{J5OOr|Te$d`&&UVOyF4H#h%H0d%d3pu}@j26Q>~T+Uvj?DlczIGnSNd3FLoY(wp?~N!49yNn5g(&w{|LCG%KPR>V^%)fWq_Kk4C<@^mNV zbHOQIN3wP^o(1{)lO8?`@;@)K|IeDdDJY zUQS+N@=9`p$&KVIOl~4Ko7_Ual6$T(R*_em+)7p;hunB?6}k`Q-I;eNFIJ4d+5P}m C5zXBI literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/__pycache__/ParamsManager.cpython-311.pyc b/4ch-Z_Generator/__pycache__/ParamsManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6018756c808ad38321f86240e14871cc23796a7 GIT binary patch literal 3205 zcmb_eOH3O_7@paOS;IPRAYhV^VjvCOMo9~#3Pp$n6(#8b6e*FKxUN>NcL^qbkX;i3 zG7^VKbz2TJMRFQdiVrO%B2uGXnoAGddbE)xtd$~FYH6AqQBo<&ssBG~8!wMb)mi)7 ze;zxJ@BikX`O)L4C6K;a8Xo_~MaUnRDJP+1yyyobLo}k%C<)ka8laHpqFjs*@RV@m zJkj{uL=%=cLRR2!r+}c*OGFW$VRl5JmT)nY91E9f*{j_4#VN>Uh)%HQ0H?V%?lukZ z*emoR0E(Ij=+az(HChdzq)E_wt>w8GGD0zPI1~?E(+$ft!Ls3U*EkN^Jp4jVqL&uD&--?(?6IuwS9vwB@ z@U@9!`~Ck6!)vH7I6OU+2v5fJcrv*0%MXA4`du*a_m@9C{o?bd_il$nrv7yC{$J^Z zjc=EOr@~_=0_u4^t{b6b!U#H6d2(Xfl2kPkk0e!frpZ}XE|+llHh?)&JajZI%zKNH zye_q_Nv(OQtsu4K%D)%Th=i+IK=(7ou7Hst$*Q^(8L#A)z*?!~velepmn>;iqYpW! zG;B5%e&jNcRReSaA*LlU{?x>Eg*R|;MxZ6et^>CUHR_FZqfSOlF~w)DOZYJUuoq8=!CPz>7KA_;pcsQX&;@6(xI?sWRU6Hs3KDOkNe?n$B z5>X^t6qw*Pr#}y-LBWY!d2zr|4_V zcIJIb`ocy-SFc{}S;s2OdRWYA{lURr zezjK^?5|lpLjfJ35Q$?#1`nc;X%-50rd@;#+n5QN{%0Xmr?_BCR12BgL&*FdLgt-Y zZC2P_!121><(m@lY#K2Rz~U`x7)|gtd;p4Mw4i+i;Z1~A1PtbeAE6Dv5~7KaR#syN z79T};3jsOarb0u3vh5a4#~sErO9D*B}n=B{}DLJ48Nx zF9^|NmY)^&I-yfSir*$Fh_}0+LMhQH7fR;4QrsnC;3=u_mKaIuG1E8(Im;EAfUu(} zE*5L7Iyj%;f&nLdIBB^t=3t~T4d!+9HFLd*77IJ2xZ}YXqsAtq$;d=hpEmC$|()u8ah@hO+Ic zxbgmkb5m8TR#jsOZ8D0stg1IALs7fNz$291Gng>g;*58(tOwu$VO`pn5fr+CfHE*| z0?bvOO@R|(2RT8a;vj{IZ=tJ3gkzur^^(}MNh)wa6c28a3hWcGb|=_V!ihj|!brv9 z7~ZjxW6{WG_PvTt_B2-FMTafmwbXBOFkpNDW#DOIegXh-gVG|Yn`2LrxaZhYB+WVJ UZ`0LDVMaUQIhMWLrGgFqF9d|LZ2$lO literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/__pycache__/make_case.cpython-311.pyc b/4ch-Z_Generator/__pycache__/make_case.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae3537bb6d33049dc615aa958051778e11518e4e GIT binary patch literal 5876 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 literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/__pycache__/make_inst.cpython-311.pyc b/4ch-Z_Generator/__pycache__/make_inst.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..148be8251a07ff9f8aa7f0cbdbacab4e4d2b7e1a GIT binary patch literal 14374 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 literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/env_gen/__pycache__/accz_gen.cpython-311.pyc b/4ch-Z_Generator/env_gen/__pycache__/accz_gen.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2516cdc2ed90cdc080bb6ebbdda991209431500e GIT binary patch literal 1567 zcmZ`&O=ufO6rR!QXSFL?m1DOKb!cO1wGueShNh$`HHup$6l&_$Zi0U*Hrllc~r;pWD7>|B@$gMtd^i9_vH~-B&9XaB`d;e@jPeZ$nFWSLDG?wu4;Hil)3-F%k zP{0;4aWjCB1tnOXoQ#m_$hi>Wt1`s5TRH1q3#$T;txG0HIkm;+VUX&yyq32NvF%oT zUAEe@TM^)MsIDB;lmn!8F3#S@;cT**EjEM}p_YbOGOx?>o~_z)oR6cr&quOxUW#US z1}N<=_$*%=w!2l0a9WS^?8z+G`Fm8CW%stR6Fg^=%W|JZX~yh2{B4MyRu%sCp00OT zBDrn`n{nu0OB-eQxZMh1)Rtw-mp`DIl4NeV=E+qBAgkop| z^IAp&>?|1sm^gSdN+OZti!1sX^V-g;vZ9f90G7+!=!Nd&(V-}BM2o@V_4}7f7ijP; z>g%Uss49l?(OTe@;=7w``CEsgRFI3&;?jf5RP3#ay%3W+f4K4e%?HsEE)D(Ue0Ym? z^;f(4sTBIX@3+vC&d1$5!ABQ&#vfgxk&$X-Wbg7{cc0EZ8$Td_FYn*3+`h9vU74QQ zkJH#}H8x9c%+km#mA=Z4)rSsk9F1Cul`NyRVo(L;ZraHptjP8X*0v6@FdMuO`C z9JU~B`U<`cA76@a?olfCRK=c(*kga$lnT;@RFgaMpPWFGP}objRtWDH;r~D3zn!fl z!lmC>af!vkZsy7?r}Z_`0WJ%s6_aZumAnf#V5`O5m`OL^$nW7-M8bUiHVn_j57Jq6 oIi-C_u7Jy>YeZo<7BI#&)LCghHS|WM{W*5ZIB<+!GT0RV1IT=0#sB~S literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/env_gen/__pycache__/acz.cpython-311.pyc b/4ch-Z_Generator/env_gen/__pycache__/acz.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76aa611619d5393bfdf8ab4108ad8260c0e3094b GIT binary patch literal 10968 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 literal 0 HcmV?d00001 diff --git a/4ch-Z_Generator/env_gen/__pycache__/flattop.cpython-311.pyc b/4ch-Z_Generator/env_gen/__pycache__/flattop.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86abfb547bf6c31d0087aa7a8cce4dbeec4eb660 GIT binary patch literal 1332 zcmb7D-D}%c6u(!JZTTzEmC-G*qNJm%v!+>EN+E13?mAWm8>K6IFomK~O+)sVM7?cD2+;Pq(->FAt$ z&iS3MtMB9S2m<}gftRuGAsEy_3{l)D#3_Mu62*pMep!S__T2-&P z^PuzX!{+T_Q|YDi}o?gsB-Bol53s z#3JlQC&nmFQi)B3278@S5$dPHRg;Fubu*jEs}x_Q*rGzdL<9YUA{CZq;XO@p+8hHQ zR^0(TKYMZRnz>LQmH}&;Nlm}EkS)&4tEN7k(G8ubR)Ngu#^={TyOz$WmQ^U8DlXGd zUnZ{tB>U^kU0@FCo= xi: + lowerboundp = i + else: + break + if lowerboundp < self.len - 1: + upperboundp = lowerboundp + 1 + else: + lowerboundp, upperboundp = self.len - 2, self.len - 1 + + x0, y0, x1, y1 = self.xs[lowerboundp], self.ys[lowerboundp], self.xs[upperboundp], self.ys[upperboundp] + if x1 == x0: + return (y0 + y1) / 2.0 + + return y0 + (x-x0)/(x1-x0)*(y1-y0) + + + + +def linspace(start : float, end : float, n : int): + samples = [] + step = (end - start) / (n-1) + for i in range(n): + samples.append(start + float(i)*step) + return samples + +def zeros(n : int): + return [0] * n + +def aczwave(amplitude : float, length : int, + carrierFreq : float, carrierPhase : float, dragAlpha : float, + thf : float, thi : float, lam2 : float, lam3 : float): + + t = linspace(0, 1, length) + han2 = [] + for k, x in enumerate(t): + han2.append( + (1-lam3)*(1-math.cos(2.0*math.pi*x)) + + lam2*(1-math.cos(4*math.pi*x)) + + lam3*(1-math.cos(6*math.pi*x)) + ) + maxHan2 = max(han2) + + ths1 = [] + for k in range(length): + ths1.append( + thi + (thf-thi)*han2[k]/maxHan2 + ) + t1u = zeros(length) + for k, v in enumerate(t1u): + if k < (length - 1): + t1u[k+1] = v + math.sin(ths1[k])/float(length-1) + + for k, v in enumerate(t): + t[k] = v * t1u[length-1] + + th = Interp1d(t1u, ths1) + th0 = 1.0 / math.tan(th(t[0])) + + thval = [] + for k in range(length): + thval.append( + 1.0/math.tan(th(t[k])) - th0 + ) + thmin = min(thval) + + samples = [] + for k in range(length): + env = thval[k] * amplitude / thmin + samples.append(complex(env, 0)) + + return samples + + +def test(): + amplitude = 26214 + length = 30 + carrierFreq = 0 + carrierPhase = 0.000000 + dragAlpha = 0.000000 + thf = 0.864 + thi = 0.05 + lam2 = -0.18 + lam3 = 0.04 + + data = aczwave( + amplitude, length, carrierFreq, + carrierPhase, dragAlpha, + thf, thi, lam2, lam3, + ) + for c in data: + print(c.real, c.imag) + return data + + +class Benchmark: + def __init__(self, num_samplings : int): + self.data_dir = "data" + self.num_samplings = num_samplings + self.params_dict = {} + self.gt_dict = {} + self.load_params() + self.load_gt() + + def load_params(self): + for i in range(self.num_samplings): + file = os.path.join(self.data_dir, "aczgo_param_{}.log".format(i)) + with open(file, 'r') as f: + lines = f.readlines() + params = {} + for line in lines: + key, value = line.split(", ") + if key=="length": + value = int(value) + else: + value = float(value) + params[key] = value + + self.params_dict[i] = params + + def eval(self, idx): + params = self.params_dict[idx] + + amplitude = params["amplitude"] + length = params["length"] + carrierFreq = params["carrierFreq"] + carrierPhase = params["carrierPhase"] + dragAlpha = params["dragAlpha"] + thf = params["thf"] + thi = params["thi"] + lam2 = params["lam2"] + lam3 = params["lam3"] + + data = aczwave( + amplitude, length, carrierFreq, + carrierPhase, dragAlpha, + thf, thi, lam2, lam3, + ) + xs, ys = [], [] + for c in data: + xs.append(c.real) + ys.append(c.imag) + + return (xs, ys) + + def load_gt(self): + for i in range(self.num_samplings): + file = os.path.join(self.data_dir, "aczgo_result_{}.log".format(i)) + xs, ys = [], [] + with open(file, 'r') as f: + lines = f.readlines() + for line in lines: + x, y = line.split(", ") + x, y = float(x), float(y) + xs.append(x) + ys.append(y) + self.gt_dict[i] = (xs, ys) + + def test(self, idx): + def check_valid(vs): + return all(map(lambda x:not np.isnan(x) and not np.isinf(x), vs)) + def max_ab_dis(xs, bxs): + return np.abs(np.array(bxs) - np.array(xs)).max() + + + (bxs, bys) = self.gt_dict[idx] + if check_valid(bxs) and check_valid(bys): + xs, ys = self.eval(idx) + return (max_ab_dis(xs, bxs), max_ab_dis(ys, bys)) + else: + return "not valid" + + def test_all(self): + for i in range(self.num_samplings): + print(self.test(i)) + + +if __name__ == "__main__": + b = Benchmark(11) + print(b.test_all()) + + + +# data = test() +# +# np.savetxt('D:/Work/TailCorr/acz_750.csv', data, delimiter=' ') +# plt.figure() +# plt.plot(data) +# plt.show() + + diff --git a/4ch-Z_Generator/env_gen/flattop.py b/4ch-Z_Generator/env_gen/flattop.py new file mode 100644 index 0000000..54dba31 --- /dev/null +++ b/4ch-Z_Generator/env_gen/flattop.py @@ -0,0 +1,75 @@ + +import numpy as np +from scipy.special import erf + +def flattop(A, edge, length, fsn): + ''' + 生成平顶包络函数 (Python版本) + + Parameters: + ----------- + A : float + 幅度 + edge : float + 边沿时间参数 + length : int + 长度(采样点数) + fsn : float + 采样频率 + + Returns: + -------- + numpy.ndarray + 平顶包络波形 + ''' + Ts = 0 + r_sigma = 0.21230 + + T = length / fsn + t = np.arange(0, length + 2) / fsn + + mu = 0.5 * edge + sigma = r_sigma * (edge - 1) + p = T - 1 - edge + + x1 = (t - mu - Ts) / (np.sqrt(2) * sigma) + x2 = (t - mu - p + Ts) / (np.sqrt(2) * sigma) + + f = A / 2 * (erf(x1) - erf(x2)) + # f_padded = np.pad(f, (1, 1), mode='constant', constant_values=0) + + return f +""" +# 使用示例 +if __name__ == "__main__": + # 测试参数 + A = 1.0 # 幅度 + edge = 0.1 # 边沿时间 + length = 1000 # 长度 + fsn = 10000 # 采样频率 + + # 生成平顶包络 + envelope = flattop(A, edge, length, fsn) + + print(f"生成的包络长度: {len(envelope)}") + print(f"最大值: {np.max(envelope):.6f}") + print(f"最小值: {np.min(envelope):.6f}") + + # 可选:绘图显示 + try: + import matplotlib.pyplot as plt + + plt.figure(figsize=(10, 6)) + time_axis = np.arange(len(envelope)) / fsn + plt.plot(time_axis, envelope, 'b-', linewidth=2) + plt.xlabel('时间 (s)') + plt.ylabel('幅度') + plt.title('平顶包络波形') + plt.grid(True, alpha=0.3) + plt.tight_layout() + plt.show() + + except ImportError: + print("matplotlib 未安装,跳过绘图") + +""" \ No newline at end of file diff --git a/4ch-Z_Generator/gen_cases/General/env2.json b/4ch-Z_Generator/gen_cases/General/env2.json new file mode 100644 index 0000000..fd1fd7f --- /dev/null +++ b/4ch-Z_Generator/gen_cases/General/env2.json @@ -0,0 +1,150 @@ +{ + "channel": 3, + "chip_mode": "AWG", + "mode": "nco", + "tail_en": false, + "tc_coef_set": "coef3", + "inner_sync": false, + "amp_mod_enable": true, + "freq_mod_enable": true, + "bias_enable": true, + "fcw": [ + 400, + 200, + 300, + 400 + ], + "mcu_reg_clr": true, + "pcw": [ + 0, + 30, + 45, + 90, + 120, + 135, + 150, + 180 + ], + "rz_ff_pha": 0, + "rz_fm_pha": 45, + "ff_amp": [ + 32767, + 32767, + 32767, + 32767 + ], + "fm_amp": [ + 32767, + 32767, + 32767, + 32767 + ], + "bias": [ + 1, + 2, + 3, + 4 + ], + "fm_en": false, + "instr_type": "general_send_wait", + "send_interval": [ + 100, + 150, + 200, + 250, + 300, + 350, + 400, + 450, + 500 + ], + "cycle_num": 1, + "codeword_configs": [ + { + "wave_hold": 0, + "fcw_index": 0, + "pcw_index": 0, + "code_clr": 1, + "env_index": 4 + }, + { + "wave_hold": 0, + "fcw_index": 0, + "pcw_index": 0, + "code_clr": 1, + "env_index": 5 + }, + { + "wave_hold": 0, + "fcw_index": 0, + "pcw_index": 0, + "code_clr": 1, + "env_index": 6 + }, + { + "wave_hold": 0, + "fcw_index": 0, + "pcw_index": 0, + "code_clr": 1, + "env_index": 7 + }, + { + "wave_hold": 0, + "fcw_index": 0, + "pcw_index": 0, + "code_clr": 1, + "env_index": 8 + } + ], + "sweep_config": { + "sweep_num": 0, + "offsets": [ + 120, + 64 + ], + "steps": [ + 3000, + 143165576 + ] + }, + "envelope_configs": [ + { + "envelope_type": "rect_hold", + "amp": 32767 + }, + { + "envelope_type": "flattop_hold", + "amp": 32767, + "edge_time": 3.5, + "wave_time": 30 + }, + { + "envelope_type": "acz", + "amp": 32767, + "wave_time": 48 + }, + { + "envelope_type": "accz", + "wave_time": 48 + }, + { + "envelope_type": "cosine", + "amp": 32767, + "wave_time": 300 + }, + { + "envelope_type": "rect", + "amp": 32767, + "wave_time": 12 + }, + { + "envelope_type": "flattop", + "amp": 32767, + "edge_time": 2, + "wave_time": 22 + } + ], + "FolderName": "General", + "CaseName": "env2", + "config_file": "D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\General\\env2_HEX.txt" +} \ No newline at end of file diff --git a/4ch-Z_Generator/gen_cases/General/env2_HEX.txt b/4ch-Z_Generator/gen_cases/General/env2_HEX.txt new file mode 100644 index 0000000..7d4f9eb --- /dev/null +++ b/4ch-Z_Generator/gen_cases/General/env2_HEX.txt @@ -0,0 +1,1452 @@ +00300108 +00100004 +00000006 + +00300104 +00100004 +00000000 + +00200040 +00100058 +08888888 +11111111 +19999999 +22222222 +80000000 +00000000 +15550000 +1fff0000 +3fff0000 +55550000 +5fff0000 +6aaa0000 +7fff0000 +00000000 +7fff7fff +7fff7fff +7fff7fff +7fff7fff +00010000 +00020000 +00030000 +00040000 + +002000b4 +00100004 +00000000 + +00400000 +00100024 +00000004 +00080004 +00100008 +00200008 +00300030 +00900030 +00f0012c +0348000c +03600018 + +00500000 +00100390 +7fff7fff +7fff7fff +00000000 +00000000 +0a16000f +7ecf5730 +7ffe7ffe +7fff7ffe +7ffe7fff +7ffe7ffe +57307ecf +000f0a16 +496b0000 +6aa260df +73d97031 +785e7671 +7b0b79db +7cc77c02 +7dfa7d70 +7ed17e6e +7f647f20 +7fc37f98 +7ff57fe0 +7fff7fff +7fe17ff6 +7f9b7fc6 +7f2a7f6c +7e867ee3 +7da37e21 +7c6b7d15 +7ab87ba3 +78347995 +7446767c +6d347154 +5c2466f9 +00004322 +09f90000 +1d4b13cb +2ecd2657 +3d8e3692 +48f643b2 +50d94d57 +55755389 +576256b5 +57715797 +568c570f +55845601 +54f55527 +552754f5 +56015584 +570f568c +57975771 +56b55762 +53895575 +4d5750d9 +43b248f6 +36923d8e +26572ecd +13cb1d4b +000009f9 +00030000 +0020000e +00590039 +00af0081 +012200e5 +01b00166 +025b0202 +032102bb +0403038f +0500047e +06170588 +074806ac +089207ea +09f60941 +0b720ab1 +0d050c38 +0eaf0dd7 +10700f8d +12451158 +14301338 +162e152c +183e1734 +1a61194e +1c951b79 +1ed81db4 +212a1fff +238a2259 +25f724bf +28702732 +2af329b0 +2d802c38 +30152ec9 +32b13162 +35533401 +37fa36a6 +3aa4394e +3d513bfa +3fff3ea8 +42ad4156 +455a4404 +480446b0 +4aab4958 +4d4d4bfd +4fe94e9c +527e5135 +550b53c6 +578e564e +5a0758cc +5c745b3f +5ed45da5 +61265fff +6369624a +659d6485 +67c066b0 +69d068ca +6bce6ad2 +6db96cc6 +6f8e6ea6 +714f7071 +72f97227 +748c73c6 +7608754d +776c76bd +78b67814 +79e77952 +7afe7a76 +7bfb7b80 +7cdd7c6f +7da37d43 +7e4e7dfc +7edc7e98 +7f4f7f19 +7fa57f7d +7fde7fc5 +7ffb7ff0 +7ffb7fff +7fde7ff0 +7fa57fc5 +7f4f7f7d +7edc7f19 +7e4e7e98 +7da37dfc +7cdd7d43 +7bfb7c6f +7afe7b80 +79e77a76 +78b67952 +776c7814 +760876bd +748c754d +72f973c6 +714f7227 +6f8e7071 +6db96ea6 +6bce6cc6 +69d06ad2 +67c068ca +659d66b0 +63696485 +6126624a +5ed45fff +5c745da5 +5a075b3f +578e58cc +550b564e +527e53c6 +4fe95135 +4d4d4e9c +4aab4bfd +48044958 +455a46b0 +42ad4404 +3fff4156 +3d513ea8 +3aa43bfa +37fa394e +355336a6 +32b13401 +30153162 +2d802ec9 +2af32c38 +287029b0 +25f72732 +238a24bf +212a2259 +1ed81fff +1c951db4 +1a611b79 +183e194e +162e1734 +1430152c +12451338 +10701158 +0eaf0f8d +0d050dd7 +0b720c38 +09f60ab1 +08920941 +074807ea +061706ac +05000588 +0403047e +0321038f +025b02bb +01b00202 +01220166 +00af00e5 +00590081 +00200039 +0003000e +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +3fff0000 +7fff7ffe +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7ffe7fff +00003fff +00000000 + +002000dc +00100048 +00000000 +00000001 +00000005 +00000002 +00044000 +00000064 +00045000 +00000096 +00046000 +000000c8 +00047000 +000000fa +00048000 +0000012c +00000078 +00000040 +00000bb8 +08888888 + +00100000 +001000ec +001000b7 +00200137 +00400193 +01600213 +04008293 +04010313 +fff20213 +0002af83 +01f32023 +003282b3 +00330333 +fe0216e3 +0b40af83 +0bf12a23 +0dc0a503 +0e00a583 +0e40a603 +0e80a883 +0ec08693 +00361713 +00e68933 +00289713 +00e90a33 +00058e13 +fffe0e13 +00060d13 +00068c93 +fffd0d13 +000caf83 +004caf03 +008c8c93 +000fa00b +000d1463 +00000663 +fe8f000b +fe0d10e3 +fdcf000b +fc0e16e3 +04050863 +fff50513 +0640000b +fa088ce3 +00088213 +00090a93 +000a0b93 +fff20213 +000aae83 +000bac03 +01d082b3 +0002af83 +018f8fb3 +01f2a023 +01d10333 +01f32023 +004a8a93 +004b8b93 +fc021ae3 +f6000ce3 +0000002b + +00900108 +00100004 +00000006 + +00900104 +00100004 +00000000 + +00800040 +00100058 +11111111 +11111111 +19999999 +22222222 +80000000 +00000000 +15550000 +1fff0000 +3fff0000 +55550000 +5fff0000 +6aaa0000 +7fff0000 +00000000 +7fff7fff +7fff7fff +7fff7fff +7fff7fff +00010000 +00020000 +00030000 +00040000 + +008000b4 +00100004 +00000000 + +00a00000 +00100024 +00000004 +00080004 +00100008 +00200008 +00300030 +00900030 +00f0012c +0348000c +03600018 + +00b00000 +00100390 +7fff7fff +7fff7fff +00000000 +00000000 +0a16000f +7ecf5730 +7ffe7ffe +7fff7ffe +7ffe7fff +7ffe7ffe +57307ecf +000f0a16 +496b0000 +6aa260df +73d97031 +785e7671 +7b0b79db +7cc77c02 +7dfa7d70 +7ed17e6e +7f647f20 +7fc37f98 +7ff57fe0 +7fff7fff +7fe17ff6 +7f9b7fc6 +7f2a7f6c +7e867ee3 +7da37e21 +7c6b7d15 +7ab87ba3 +78347995 +7446767c +6d347154 +5c2466f9 +00004322 +09f90000 +1d4b13cb +2ecd2657 +3d8e3692 +48f643b2 +50d94d57 +55755389 +576256b5 +57715797 +568c570f +55845601 +54f55527 +552754f5 +56015584 +570f568c +57975771 +56b55762 +53895575 +4d5750d9 +43b248f6 +36923d8e +26572ecd +13cb1d4b +000009f9 +00030000 +0020000e +00590039 +00af0081 +012200e5 +01b00166 +025b0202 +032102bb +0403038f +0500047e +06170588 +074806ac +089207ea +09f60941 +0b720ab1 +0d050c38 +0eaf0dd7 +10700f8d +12451158 +14301338 +162e152c +183e1734 +1a61194e +1c951b79 +1ed81db4 +212a1fff +238a2259 +25f724bf +28702732 +2af329b0 +2d802c38 +30152ec9 +32b13162 +35533401 +37fa36a6 +3aa4394e +3d513bfa +3fff3ea8 +42ad4156 +455a4404 +480446b0 +4aab4958 +4d4d4bfd +4fe94e9c +527e5135 +550b53c6 +578e564e +5a0758cc +5c745b3f +5ed45da5 +61265fff +6369624a +659d6485 +67c066b0 +69d068ca +6bce6ad2 +6db96cc6 +6f8e6ea6 +714f7071 +72f97227 +748c73c6 +7608754d +776c76bd +78b67814 +79e77952 +7afe7a76 +7bfb7b80 +7cdd7c6f +7da37d43 +7e4e7dfc +7edc7e98 +7f4f7f19 +7fa57f7d +7fde7fc5 +7ffb7ff0 +7ffb7fff +7fde7ff0 +7fa57fc5 +7f4f7f7d +7edc7f19 +7e4e7e98 +7da37dfc +7cdd7d43 +7bfb7c6f +7afe7b80 +79e77a76 +78b67952 +776c7814 +760876bd +748c754d +72f973c6 +714f7227 +6f8e7071 +6db96ea6 +6bce6cc6 +69d06ad2 +67c068ca +659d66b0 +63696485 +6126624a +5ed45fff +5c745da5 +5a075b3f +578e58cc +550b564e +527e53c6 +4fe95135 +4d4d4e9c +4aab4bfd +48044958 +455a46b0 +42ad4404 +3fff4156 +3d513ea8 +3aa43bfa +37fa394e +355336a6 +32b13401 +30153162 +2d802ec9 +2af32c38 +287029b0 +25f72732 +238a24bf +212a2259 +1ed81fff +1c951db4 +1a611b79 +183e194e +162e1734 +1430152c +12451338 +10701158 +0eaf0f8d +0d050dd7 +0b720c38 +09f60ab1 +08920941 +074807ea +061706ac +05000588 +0403047e +0321038f +025b02bb +01b00202 +01220166 +00af00e5 +00590081 +00200039 +0003000e +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +3fff0000 +7fff7ffe +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7ffe7fff +00003fff +00000000 + +008000dc +00100048 +00000000 +00000001 +00000005 +00000002 +00044000 +00000064 +00045000 +00000096 +00046000 +000000c8 +00047000 +000000fa +00048000 +0000012c +00000078 +00000040 +00000bb8 +08888888 + +00700000 +001000ec +001000b7 +00200137 +00400193 +01600213 +04008293 +04010313 +fff20213 +0002af83 +01f32023 +003282b3 +00330333 +fe0216e3 +0b40af83 +0bf12a23 +0dc0a503 +0e00a583 +0e40a603 +0e80a883 +0ec08693 +00361713 +00e68933 +00289713 +00e90a33 +00058e13 +fffe0e13 +00060d13 +00068c93 +fffd0d13 +000caf83 +004caf03 +008c8c93 +000fa00b +000d1463 +00000663 +fe8f000b +fe0d10e3 +fdcf000b +fc0e16e3 +04050863 +fff50513 +0640000b +fa088ce3 +00088213 +00090a93 +000a0b93 +fff20213 +000aae83 +000bac03 +01d082b3 +0002af83 +018f8fb3 +01f2a023 +01d10333 +01f32023 +004a8a93 +004b8b93 +fc021ae3 +f6000ce3 +0000002b + +00f00108 +00100004 +00000006 + +00f00104 +00100004 +00000000 + +00e00040 +00100058 +19999999 +11111111 +19999999 +22222222 +80000000 +00000000 +15550000 +1fff0000 +3fff0000 +55550000 +5fff0000 +6aaa0000 +7fff0000 +00000000 +7fff7fff +7fff7fff +7fff7fff +7fff7fff +00010000 +00020000 +00030000 +00040000 + +00e000b4 +00100004 +00000000 + +01000000 +00100024 +00000004 +00080004 +00100008 +00200008 +00300030 +00900030 +00f0012c +0348000c +03600018 + +01100000 +00100390 +7fff7fff +7fff7fff +00000000 +00000000 +0a16000f +7ecf5730 +7ffe7ffe +7fff7ffe +7ffe7fff +7ffe7ffe +57307ecf +000f0a16 +496b0000 +6aa260df +73d97031 +785e7671 +7b0b79db +7cc77c02 +7dfa7d70 +7ed17e6e +7f647f20 +7fc37f98 +7ff57fe0 +7fff7fff +7fe17ff6 +7f9b7fc6 +7f2a7f6c +7e867ee3 +7da37e21 +7c6b7d15 +7ab87ba3 +78347995 +7446767c +6d347154 +5c2466f9 +00004322 +09f90000 +1d4b13cb +2ecd2657 +3d8e3692 +48f643b2 +50d94d57 +55755389 +576256b5 +57715797 +568c570f +55845601 +54f55527 +552754f5 +56015584 +570f568c +57975771 +56b55762 +53895575 +4d5750d9 +43b248f6 +36923d8e +26572ecd +13cb1d4b +000009f9 +00030000 +0020000e +00590039 +00af0081 +012200e5 +01b00166 +025b0202 +032102bb +0403038f +0500047e +06170588 +074806ac +089207ea +09f60941 +0b720ab1 +0d050c38 +0eaf0dd7 +10700f8d +12451158 +14301338 +162e152c +183e1734 +1a61194e +1c951b79 +1ed81db4 +212a1fff +238a2259 +25f724bf +28702732 +2af329b0 +2d802c38 +30152ec9 +32b13162 +35533401 +37fa36a6 +3aa4394e +3d513bfa +3fff3ea8 +42ad4156 +455a4404 +480446b0 +4aab4958 +4d4d4bfd +4fe94e9c +527e5135 +550b53c6 +578e564e +5a0758cc +5c745b3f +5ed45da5 +61265fff +6369624a +659d6485 +67c066b0 +69d068ca +6bce6ad2 +6db96cc6 +6f8e6ea6 +714f7071 +72f97227 +748c73c6 +7608754d +776c76bd +78b67814 +79e77952 +7afe7a76 +7bfb7b80 +7cdd7c6f +7da37d43 +7e4e7dfc +7edc7e98 +7f4f7f19 +7fa57f7d +7fde7fc5 +7ffb7ff0 +7ffb7fff +7fde7ff0 +7fa57fc5 +7f4f7f7d +7edc7f19 +7e4e7e98 +7da37dfc +7cdd7d43 +7bfb7c6f +7afe7b80 +79e77a76 +78b67952 +776c7814 +760876bd +748c754d +72f973c6 +714f7227 +6f8e7071 +6db96ea6 +6bce6cc6 +69d06ad2 +67c068ca +659d66b0 +63696485 +6126624a +5ed45fff +5c745da5 +5a075b3f +578e58cc +550b564e +527e53c6 +4fe95135 +4d4d4e9c +4aab4bfd +48044958 +455a46b0 +42ad4404 +3fff4156 +3d513ea8 +3aa43bfa +37fa394e +355336a6 +32b13401 +30153162 +2d802ec9 +2af32c38 +287029b0 +25f72732 +238a24bf +212a2259 +1ed81fff +1c951db4 +1a611b79 +183e194e +162e1734 +1430152c +12451338 +10701158 +0eaf0f8d +0d050dd7 +0b720c38 +09f60ab1 +08920941 +074807ea +061706ac +05000588 +0403047e +0321038f +025b02bb +01b00202 +01220166 +00af00e5 +00590081 +00200039 +0003000e +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +3fff0000 +7fff7ffe +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7ffe7fff +00003fff +00000000 + +00e000dc +00100048 +00000000 +00000001 +00000005 +00000002 +00044000 +00000064 +00045000 +00000096 +00046000 +000000c8 +00047000 +000000fa +00048000 +0000012c +00000078 +00000040 +00000bb8 +08888888 + +00d00000 +001000ec +001000b7 +00200137 +00400193 +01600213 +04008293 +04010313 +fff20213 +0002af83 +01f32023 +003282b3 +00330333 +fe0216e3 +0b40af83 +0bf12a23 +0dc0a503 +0e00a583 +0e40a603 +0e80a883 +0ec08693 +00361713 +00e68933 +00289713 +00e90a33 +00058e13 +fffe0e13 +00060d13 +00068c93 +fffd0d13 +000caf83 +004caf03 +008c8c93 +000fa00b +000d1463 +00000663 +fe8f000b +fe0d10e3 +fdcf000b +fc0e16e3 +04050863 +fff50513 +0640000b +fa088ce3 +00088213 +00090a93 +000a0b93 +fff20213 +000aae83 +000bac03 +01d082b3 +0002af83 +018f8fb3 +01f2a023 +01d10333 +01f32023 +004a8a93 +004b8b93 +fc021ae3 +f6000ce3 +0000002b + +01500108 +00100004 +00000006 + +01500104 +00100004 +00000000 + +01400040 +00100058 +22222222 +11111111 +19999999 +22222222 +80000000 +00000000 +15550000 +1fff0000 +3fff0000 +55550000 +5fff0000 +6aaa0000 +7fff0000 +00000000 +7fff7fff +7fff7fff +7fff7fff +7fff7fff +00010000 +00020000 +00030000 +00040000 + +014000b4 +00100004 +00000000 + +01600000 +00100024 +00000004 +00080004 +00100008 +00200008 +00300030 +00900030 +00f0012c +0348000c +03600018 + +01700000 +00100390 +7fff7fff +7fff7fff +00000000 +00000000 +0a16000f +7ecf5730 +7ffe7ffe +7fff7ffe +7ffe7fff +7ffe7ffe +57307ecf +000f0a16 +496b0000 +6aa260df +73d97031 +785e7671 +7b0b79db +7cc77c02 +7dfa7d70 +7ed17e6e +7f647f20 +7fc37f98 +7ff57fe0 +7fff7fff +7fe17ff6 +7f9b7fc6 +7f2a7f6c +7e867ee3 +7da37e21 +7c6b7d15 +7ab87ba3 +78347995 +7446767c +6d347154 +5c2466f9 +00004322 +09f90000 +1d4b13cb +2ecd2657 +3d8e3692 +48f643b2 +50d94d57 +55755389 +576256b5 +57715797 +568c570f +55845601 +54f55527 +552754f5 +56015584 +570f568c +57975771 +56b55762 +53895575 +4d5750d9 +43b248f6 +36923d8e +26572ecd +13cb1d4b +000009f9 +00030000 +0020000e +00590039 +00af0081 +012200e5 +01b00166 +025b0202 +032102bb +0403038f +0500047e +06170588 +074806ac +089207ea +09f60941 +0b720ab1 +0d050c38 +0eaf0dd7 +10700f8d +12451158 +14301338 +162e152c +183e1734 +1a61194e +1c951b79 +1ed81db4 +212a1fff +238a2259 +25f724bf +28702732 +2af329b0 +2d802c38 +30152ec9 +32b13162 +35533401 +37fa36a6 +3aa4394e +3d513bfa +3fff3ea8 +42ad4156 +455a4404 +480446b0 +4aab4958 +4d4d4bfd +4fe94e9c +527e5135 +550b53c6 +578e564e +5a0758cc +5c745b3f +5ed45da5 +61265fff +6369624a +659d6485 +67c066b0 +69d068ca +6bce6ad2 +6db96cc6 +6f8e6ea6 +714f7071 +72f97227 +748c73c6 +7608754d +776c76bd +78b67814 +79e77952 +7afe7a76 +7bfb7b80 +7cdd7c6f +7da37d43 +7e4e7dfc +7edc7e98 +7f4f7f19 +7fa57f7d +7fde7fc5 +7ffb7ff0 +7ffb7fff +7fde7ff0 +7fa57fc5 +7f4f7f7d +7edc7f19 +7e4e7e98 +7da37dfc +7cdd7d43 +7bfb7c6f +7afe7b80 +79e77a76 +78b67952 +776c7814 +760876bd +748c754d +72f973c6 +714f7227 +6f8e7071 +6db96ea6 +6bce6cc6 +69d06ad2 +67c068ca +659d66b0 +63696485 +6126624a +5ed45fff +5c745da5 +5a075b3f +578e58cc +550b564e +527e53c6 +4fe95135 +4d4d4e9c +4aab4bfd +48044958 +455a46b0 +42ad4404 +3fff4156 +3d513ea8 +3aa43bfa +37fa394e +355336a6 +32b13401 +30153162 +2d802ec9 +2af32c38 +287029b0 +25f72732 +238a24bf +212a2259 +1ed81fff +1c951db4 +1a611b79 +183e194e +162e1734 +1430152c +12451338 +10701158 +0eaf0f8d +0d050dd7 +0b720c38 +09f60ab1 +08920941 +074807ea +061706ac +05000588 +0403047e +0321038f +025b02bb +01b00202 +01220166 +00af00e5 +00590081 +00200039 +0003000e +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +3fff0000 +7fff7ffe +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7fff7fff +7ffe7fff +00003fff +00000000 + +014000dc +00100048 +00000000 +00000001 +00000005 +00000002 +00044000 +00000064 +00045000 +00000096 +00046000 +000000c8 +00047000 +000000fa +00048000 +0000012c +00000078 +00000040 +00000bb8 +08888888 + +01300000 +001000ec +001000b7 +00200137 +00400193 +01600213 +04008293 +04010313 +fff20213 +0002af83 +01f32023 +003282b3 +00330333 +fe0216e3 +0b40af83 +0bf12a23 +0dc0a503 +0e00a583 +0e40a603 +0e80a883 +0ec08693 +00361713 +00e68933 +00289713 +00e90a33 +00058e13 +fffe0e13 +00060d13 +00068c93 +fffd0d13 +000caf83 +004caf03 +008c8c93 +000fa00b +000d1463 +00000663 +fe8f000b +fe0d10e3 +fdcf000b +fc0e16e3 +04050863 +fff50513 +0640000b +fa088ce3 +00088213 +00090a93 +000a0b93 +fff20213 +000aae83 +000bac03 +01d082b3 +0002af83 +018f8fb3 +01f2a023 +01d10333 +01f32023 +004a8a93 +004b8b93 +fc021ae3 +f6000ce3 +0000002b + diff --git a/4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED.json b/4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED.json new file mode 100644 index 0000000..3805adb --- /dev/null +++ b/4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED.json @@ -0,0 +1,49 @@ +{ + "channel": 3, + "chip_mode": "RAMP", + "ramp_ctrl": "MCU", + "instr_type": "ramp_fixed", + "fixed_value": [ + 32768, + 32769, + 32770, + 32772, + 32776, + 32784, + 32800, + 32832, + 32896, + 33024, + 33280, + 33792, + 34816, + 36864, + 40960, + 49152, + 0 + ], + "wait_clk": [ + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000, + 1000 + ], + "config_param_num": 17, + "ensemble_num": 0, + "FolderName": "RAMP", + "CaseName": "RAMP_MCU_FIXED", + "config_file": "D:\\MyDocument\\工作\\Z芯片的case生成器\\4ch-Z_Generator\\gen_cases\\RAMP\\RAMP_MCU_FIXED_HEX.txt" +} \ No newline at end of file diff --git a/4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED_HEX.txt b/4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED_HEX.txt new file mode 100644 index 0000000..0d03e19 --- /dev/null +++ b/4ch-Z_Generator/gen_cases/RAMP/RAMP_MCU_FIXED_HEX.txt @@ -0,0 +1,316 @@ +00300108 +00100004 +00000008 + +00300124 +00100004 +40000000 + +002000dc +00100094 +80000000 +00000000 +00000011 +80008000 +000003e8 +80018000 +000003e8 +80028000 +000003e8 +80048000 +000003e8 +80088000 +000003e8 +80108000 +000003e8 +80208000 +000003e8 +80408000 +000003e8 +80808000 +000003e8 +81008000 +000003e8 +82008000 +000003e8 +84008000 +000003e8 +88008000 +000003e8 +90008000 +000003e8 +a0008000 +000003e8 +c0008000 +000003e8 +00008000 +000003e8 + +00100000 +00100060 +001000b7 +00200137 +0dc0af83 +0df12223 +00800193 +0e00a203 +fff20213 +00008313 +0e40a283 +fff28293 +0e832f83 +0ec32f03 +0bf12c23 +00330333 +00029463 +00c0006f +fe8f000b +fe1ff06f +fdcf000b +fc0216e3 +00f0000b +0a012c23 +0c012223 +0000002b + +00500000 +00100004 +00000000 + +00900108 +00100004 +00000008 + +00900124 +00100004 +40000000 + +008000dc +00100094 +80000000 +00000000 +00000011 +80008000 +000003e8 +80018000 +000003e8 +80028000 +000003e8 +80048000 +000003e8 +80088000 +000003e8 +80108000 +000003e8 +80208000 +000003e8 +80408000 +000003e8 +80808000 +000003e8 +81008000 +000003e8 +82008000 +000003e8 +84008000 +000003e8 +88008000 +000003e8 +90008000 +000003e8 +a0008000 +000003e8 +c0008000 +000003e8 +00008000 +000003e8 + +00700000 +00100060 +001000b7 +00200137 +0dc0af83 +0df12223 +00800193 +0e00a203 +fff20213 +00008313 +0e40a283 +fff28293 +0e832f83 +0ec32f03 +0bf12c23 +00330333 +00029463 +00c0006f +fe8f000b +fe1ff06f +fdcf000b +fc0216e3 +00f0000b +0a012c23 +0c012223 +0000002b + +00b00000 +00100004 +00000000 + +00f00108 +00100004 +00000008 + +00f00124 +00100004 +40000000 + +00e000dc +00100094 +80000000 +00000000 +00000011 +80008000 +000003e8 +80018000 +000003e8 +80028000 +000003e8 +80048000 +000003e8 +80088000 +000003e8 +80108000 +000003e8 +80208000 +000003e8 +80408000 +000003e8 +80808000 +000003e8 +81008000 +000003e8 +82008000 +000003e8 +84008000 +000003e8 +88008000 +000003e8 +90008000 +000003e8 +a0008000 +000003e8 +c0008000 +000003e8 +00008000 +000003e8 + +00d00000 +00100060 +001000b7 +00200137 +0dc0af83 +0df12223 +00800193 +0e00a203 +fff20213 +00008313 +0e40a283 +fff28293 +0e832f83 +0ec32f03 +0bf12c23 +00330333 +00029463 +00c0006f +fe8f000b +fe1ff06f +fdcf000b +fc0216e3 +00f0000b +0a012c23 +0c012223 +0000002b + +01100000 +00100004 +00000000 + +01500108 +00100004 +00000008 + +01500124 +00100004 +40000000 + +014000dc +00100094 +80000000 +00000000 +00000011 +80008000 +000003e8 +80018000 +000003e8 +80028000 +000003e8 +80048000 +000003e8 +80088000 +000003e8 +80108000 +000003e8 +80208000 +000003e8 +80408000 +000003e8 +80808000 +000003e8 +81008000 +000003e8 +82008000 +000003e8 +84008000 +000003e8 +88008000 +000003e8 +90008000 +000003e8 +a0008000 +000003e8 +c0008000 +000003e8 +00008000 +000003e8 + +01300000 +00100060 +001000b7 +00200137 +0dc0af83 +0df12223 +00800193 +0e00a203 +fff20213 +00008313 +0e40a283 +fff28293 +0e832f83 +0ec32f03 +0bf12c23 +00330333 +00029463 +00c0006f +fe8f000b +fe1ff06f +fdcf000b +fc0216e3 +00f0000b +0a012c23 +0c012223 +0000002b + +01700000 +00100004 +00000000 + diff --git a/4ch-Z_Generator/make_case.py b/4ch-Z_Generator/make_case.py new file mode 100644 index 0000000..337de33 --- /dev/null +++ b/4ch-Z_Generator/make_case.py @@ -0,0 +1,93 @@ +from ctypes import Union +import numpy as np +import random + +class make_case(object): + + def __init__( + self + ): + self = 0 + + def data_gen( + self, + mode = 'random', + length = 1, + params = {} + ): + + match mode: + case 'random': + data = [random.randint(0,2**32) for _ in range(length)] + case 'ones': + data = (2**32-1)*np.ones(length) + case 'amp': + amp = params['amp'] + amp = int(amp,0) if isinstance(amp, str) else int(amp) + data = amp*np.ones(length) + case 'zeros': + data = np.zeros(length) + case 'value': + value = params['value'] + if np.size(value) != length: + print("Warnning: Length Mismatch") + elif length ==1: + data = int(value,0) if isinstance(value, str) else int(value) + else: + data = np.zeros(length) + for i in range(0,length): + data[i] = int(value[i],0) if isinstance(value[i], str) else int(value[i]) + case 'acc': + ini_data = params['ini_data'] + ini_data = int(ini_data,0) if isinstance(ini_data, str) else int(ini_data) + step_size = params['step_size'] + step_size = int(step_size,0) if isinstance(step_size, str) else int(step_size) + data = np.zeros(length) + for i in range(0,length): + data[i] = ini_data + i*step_size + case 'rd_file': + file_name = params['file_name'] + with open(file_name, "r") as f: + data_bin = f.read() + data_bin = data_bin.split('\n') + data = [] + for d in data_bin: + data.append((int(d,2))) + return data + + def rw_once( + self, + op = 'w', + addr = 0x1F00044, + data = [0], + file_name = 'case.txt', + chip_id = 0, + exaddr = 1, + ard_flag = 0 + ): + + with open(file_name, "a") as f: + cmd = 1 if (op=='r') or (op==1) else 0 + if isinstance(addr, str): + addr = int(addr,0) + else: + addr = int(addr) + f.write(f"{((int(cmd)<<31) | (int(ard_flag)<<30) | (int(chip_id)<<25) | (addr)):08x}\n") + f.write(f"{((int(exaddr)<<20) | (int(np.size(data)*4))):08x}\n") + + if op == 'w': + if np.size(data) == 1: + if isinstance(data, str): + dt = int(data,0) + else: + dt = int(np.round(data)) + f.write(f"{(dt if dt>=0 else 2**32+dt):08x}\n") + else: + for i in range(0,np.size(data)): + if isinstance(data[i], str): + dt = int(data[i],0) + else: + dt = int(np.round(data[i])) + f.write(f"{(dt if dt>=0 else 2**32+dt):08x}\n") + f.write('\n') + diff --git a/4ch-Z_Generator/make_inst.py b/4ch-Z_Generator/make_inst.py new file mode 100644 index 0000000..fa9d79e --- /dev/null +++ b/4ch-Z_Generator/make_inst.py @@ -0,0 +1,319 @@ +import numpy as np + +class make_inst(object): + + def parse_instruction(self, instruction, labels, pc): + # 去掉所有逗号 + instruction = instruction.replace(',', ' ') + parts = instruction.split() + opcode = parts[0].upper().strip() + + if opcode.endswith(':'): + # 处理标签 + label_name = opcode[:-1] + labels[label_name] = pc + return None + + operands = [op.strip() for op in parts[1:]] + + def parse_immediate(imm_str): + try: + if imm_str.startswith('0x') or imm_str.startswith('0X'): + return int(imm_str, 16) + elif imm_str.startswith('0b') or imm_str.startswith('0B'): + return int(imm_str, 2) + elif imm_str.startswith('-0x') or imm_str.startswith('-0X'): + return -int(imm_str[1:], 16) + elif imm_str.startswith('-0b') or imm_str.startswith('-0B'): + return -int(imm_str[1:], 2) + elif imm_str.startswith('-'): + return -int(imm_str[1:], 10) + else: + return int(imm_str, 10) + except ValueError: + raise ValueError(f"Invalid immediate value: {imm_str}") + + if opcode == 'LUI': + rd, imm = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + return format((self.opcode_map[opcode]) | (imm & 0xFFFFF) << 12 | (rd << 7), '032b') + + elif opcode == 'AUIPC': + rd, imm = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + return format((self.opcode_map[opcode]) | (imm & 0xFFFFF) << 12 | (rd << 7), '032b') + + elif opcode == 'JAL': + rd, label_or_imm = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + if label_or_imm.lstrip('-').isdigit() or label_or_imm.startswith(('0x', '0X', '0b', '0B', '-0x', '-0X', '-0b', '-0B')): + imm = parse_immediate(label_or_imm) + else: + imm = labels.get(label_or_imm.upper().strip(), 0) - pc + imm_bits = (((imm >> 20) & 0x1) << 19) | (((imm >> 1) & 0x3FF) << 9) | (((imm >> 11) & 0x1) << 8) | ((imm >> 12) & 0xFF) + return format((self.opcode_map[opcode]) | (imm_bits) << 12 | (rd << 7), '032b') + + elif opcode == 'JALR': + rd = operands[0] + operands[1] = operands[1].rstrip(')') + imm, rs1 = operands[1].split('(') + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + funct3 = self.opcode_funct3_map[opcode] + return format((self.opcode_map[opcode]) | (imm & 0xFFF) << 20 | (rs1 << 15) | (funct3 << 12) | (rd << 7), '032b') + + elif opcode in ['BEQ', 'BNE', 'BLT', 'BGE', 'BLTU', 'BGEU']: + rs1, rs2, label_or_imm = operands + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + rs2 = int(rs2[1:]) # 去掉寄存器名称前的 'x' + if label_or_imm.lstrip('-').isdigit() or label_or_imm.startswith(('0x', '0X', '0b', '0B', '-0x', '-0X', '-0b', '-0B')): + imm = parse_immediate(label_or_imm) + else: + imm = labels.get(label_or_imm.upper().strip(), 0) - pc + imm_high_bits = (((imm >> 12) & 0x1) << 6) | (((imm >> 5 ) & 0x3F)) + imm_low_bits = (((imm >> 1 ) & 0xF) << 1) | (((imm >> 11) & 0x1 )) + funct3 = self.opcode_funct3_map[opcode] + return format((self.opcode_map[opcode]) | (imm_high_bits << 25) | (rs2 << 20) | (rs1 << 15) | (funct3 << 12) | (imm_low_bits << 7), '032b') + + elif opcode in ['LB', 'LH', 'LW', 'LBU', 'LHU']: + rd = operands[0] + operands[1] = operands[1].rstrip(')') + imm, rs1 = operands[1].split('(') + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + funct3 = self.opcode_funct3_map[opcode] + return format((self.opcode_map[opcode]) | ((imm & 0xFFF) << 20) | (rs1 << 15) | (funct3 << 12) | (rd << 7), '032b') + + elif opcode in ['SB', 'SH', 'SW']: + rs2 = operands[0] + operands[1] = operands[1].rstrip(')') + imm, rs1 = operands[1].split('(') + rs2 = int(rs2[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + funct3 = self.opcode_funct3_map[opcode] + return format((self.opcode_map[opcode]) | (((imm >> 5) & 0x7F) << 25) | (rs2 << 20) | (rs1 << 15) | (funct3 << 12) | ((imm & 0x1F) << 7), '032b') + + elif opcode in ['ADDI', 'SLTI', 'SLTIU', 'XORI', 'ORI', 'ANDI']: + rd, rs1, imm = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + funct3 = self.opcode_funct3_map[opcode] + return format((self.opcode_map[opcode]) | ((imm & 0xFFF) << 20) | (rs1 << 15) | (funct3 << 12) | (rd << 7), '032b') + + elif opcode in ['SLLI', 'SRLI', 'SRAI']: + rd, rs1, shamt = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + shamt = parse_immediate(shamt) + funct3 = self.opcode_funct3_map[opcode] + funct7 = self.opcode_funct7_map[opcode] + return format((self.opcode_map[opcode]) | (funct7 << 25) | ((shamt & 0x1F) << 20) | (rs1 << 15) | (funct3 << 12) | (rd << 7), '032b') + + elif opcode in ['ADD', 'SUB', 'SLL', 'SLT', 'SLTU', 'XOR', 'SRL', 'SRA', 'OR', 'AND']: + rd, rs1, rs2 = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + rs2 = int(rs2[1:]) # 去掉寄存器名称前的 'x' + funct3 = self.opcode_funct3_map[opcode] + funct7 = self.opcode_funct7_map[opcode] + return format((self.opcode_map[opcode]) | (funct7 << 25) | (rs2 << 20) | (rs1 << 15) | (funct3 << 12) | (rd << 7), '032b') + + elif opcode in ['WAIT', 'SEND', 'SENDC']: + rd, rs1, imm = operands + rd = int(rd[1:]) # 去掉寄存器名称前的 'x' + rs1 = int(rs1[1:]) # 去掉寄存器名称前的 'x' + imm = parse_immediate(imm) + funct3 = self.opcode_funct3_map[opcode] + return format((self.opcode_map[opcode]) | ((imm & 0xFFF) << 20) | (rs1 << 15) | (funct3 << 12) | (rd << 7), '032b') + + elif opcode in ['EXIT']: + return format((self.opcode_map[opcode]), '032b') + + elif opcode in ['EXIT_IR']: + return '00000000000000000001000000101011' + + else: + raise ValueError(f"Unsupported opcode: {opcode}") + + def write(self, instructions, file_name, exaddr = 1, chip_id = 0, channel_id = 0, pc_start = 0, ard_flag = 0, show = False): + if instructions == "": + pass + else: + labels = {} + binary_instructions = [] + + # 将整段汇编代码拆成多条指令组成的字符串数组 + inst_list = instructions.split('\n') + instructions = [] + for this_inst in inst_list: + this_inst = this_inst.split('#') + if this_inst[0].strip() != '': + instructions.append(this_inst[0].strip()) + + # 第一遍扫描:记录标签位置 + pc = pc_start + for instr in instructions: + binary = self.parse_instruction(instr, labels, pc) + if binary is not None: + binary_instructions.append(binary) + pc += 4 + else: + # 如果是标签,不增加pc + pass + + # 第二遍扫描:生成最终的二进制代码 + pc = pc_start + final_binary_instructions = [] + for instr in instructions: + binary = self.parse_instruction(instr, labels, pc) + if binary is not None: + final_binary_instructions.append(binary) + if show: + print(f"{instr}: {binary}") + pc += 4 + else: + # 如果是标签,不增加pc + pass + + with open(file_name, "a") as f: + base_addr = 0x010_0000 + pc_start + channel_id * 0x060_0000 + length = np.size(final_binary_instructions) + f.write(f"{((ard_flag << 30) | (chip_id << 25) | (base_addr)):08x}\n") + f.write(f"{((exaddr << 20) | (length<<2)):08x}\n") + for binary_instr in final_binary_instructions: + f.write(f"{int(binary_instr,2):08x}\n") + f.write("\n") + + return final_binary_instructions + + opcode_map = { + 'LUI': 0x37, + 'AUIPC': 0x17, + 'JAL': 0x6F, + 'JALR': 0x67, + 'BEQ': 0x63, + 'BNE': 0x63, + 'BLT': 0x63, + 'BGE': 0x63, + 'BLTU': 0x63, + 'BGEU': 0x63, + 'LB': 0x03, + 'LH': 0x03, + 'LW': 0x03, + 'LBU': 0x03, + 'LHU': 0x03, + 'SB': 0x23, + 'SH': 0x23, + 'SW': 0x23, + 'ADDI': 0x13, + 'SLTI': 0x13, + 'SLTIU': 0x13, + 'XORI': 0x13, + 'ORI': 0x13, + 'ANDI': 0x13, + 'SLLI': 0x13, + 'SRLI': 0x13, + 'SRAI': 0x13, + 'ADD': 0x33, + 'SUB': 0x33, + 'SLL': 0x33, + 'SLT': 0x33, + 'SLTU': 0x33, + 'XOR': 0x33, + 'SRL': 0x33, + 'SRA': 0x33, + 'OR': 0x33, + 'AND': 0x33, + 'WAIT': 0x0B, + 'SEND': 0x0B, + 'SENDC': 0x0B, + 'EXIT': 0x2B, + } + + opcode_funct3_map = { + 'JALR': 0x0, + 'BEQ': 0x0, + 'BNE': 0x1, + 'BLT': 0x4, + 'BGE': 0x5, + 'BLTU': 0x6, + 'BGEU': 0x7, + 'LB': 0x0, + 'LH': 0x1, + 'LW': 0x2, + 'LBU': 0x4, + 'LHU': 0x5, + 'SB': 0x0, + 'SH': 0x1, + 'SW': 0x2, + 'ADDI': 0x0, + 'SLTI': 0x2, + 'SLTIU': 0x3, + 'XORI': 0x4, + 'ORI': 0x6, + 'ANDI': 0x7, + 'SLLI': 0x1, + 'SRLI': 0x5, + 'SRAI': 0x5, + 'ADD': 0x0, + 'SUB': 0x0, + 'SLL': 0x1, + 'SLT': 0x2, + 'SLTU': 0x3, + 'XOR': 0x4, + 'SRL': 0x5, + 'SRA': 0x5, + 'OR': 0x6, + 'AND': 0x7, + 'WAIT': 0x0, + 'SEND': 0x2, + 'SENDC': 0x3, + 'EXIT': 0x0, + } + + opcode_funct7_map = { + 'JALR': 0x00, + 'BEQ': 0x00, + 'BNE': 0x00, + 'BLT': 0x00, + 'BGE': 0x00, + 'BLTU': 0x00, + 'BGEU': 0x00, + 'LB': 0x00, + 'LH': 0x00, + 'LW': 0x00, + 'LBU': 0x00, + 'LHU': 0x00, + 'SB': 0x00, + 'SH': 0x00, + 'SW': 0x00, + 'ADDI': 0x00, + 'SLTI': 0x00, + 'SLTIU': 0x00, + 'XORI': 0x00, + 'ORI': 0x00, + 'ANDI': 0x00, + 'SLLI': 0x00, + 'SRLI': 0x00, + 'SRAI': 0x20, + 'ADD': 0x00, + 'SUB': 0x20, + 'SLL': 0x00, + 'SLT': 0x00, + 'SLTU': 0x00, + 'XOR': 0x00, + 'SRL': 0x00, + 'SRA': 0x20, + 'OR': 0x00, + 'AND': 0x00, + 'WAIT': 0x00, + 'SEND': 0x00, + 'SENDC': 0x00, + 'EXIT': 0x00, + } \ No newline at end of file diff --git a/Z_case_Generator_V2.0/ZChipConfig.py b/Z_case_Generator_V2.0/ZChipConfig.py index dab08d3..911e6a2 100644 --- a/Z_case_Generator_V2.0/ZChipConfig.py +++ b/Z_case_Generator_V2.0/ZChipConfig.py @@ -314,7 +314,7 @@ class ZChipConfig(object): self.write_register(moddotr_addr, moddotr_val) #调制使能寄存器300104配置开始 - amp_mod_enable = kwargs.pop('amp_mod_enSable', False) + amp_mod_enable = kwargs.pop('amp_mod_enable', False) freq_mod_enable = kwargs.pop('freq_mod_enable', False) bias_enable = kwargs.pop('bias_enable', False) # 低电平使能逻辑:True(开启) -> 0,False(关闭) -> 1 diff --git a/Z_case_Generator_V2.0/__pycache__/ZChipConfig.cpython-311.pyc b/Z_case_Generator_V2.0/__pycache__/ZChipConfig.cpython-311.pyc index 9f8efdd456e0c000090f6d44db1308bb9e981a56..97b1b0bcdc84d15ce02857d1cf6955e3b51e6de5 100644 GIT binary patch delta 109 zcmdl!iE;HLM&9MTyj%=GkZF*fwQeKtRy%IK#N2}T-29aI)V$5->^vA*i*5qtH>)`~ zFmYP!P`xPYa7ET(bH39KR>t3xH9T_Ve*>k9qCkWQh!6r2zc_4wCY0u++7k delta 97 zcmZ2IiE;ZRM&9MTyj%=Gpmif9YyC#vt#&;8iMa*wx%nyasd>Sh&)Rt~3f$sD2qh-v sq;8gSaA4xJ++liA*71t0