aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/ic_reg_maps
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/ic_reg_maps')
-rw-r--r--host/lib/ic_reg_maps/CMakeLists.txt10
-rwxr-xr-xhost/lib/ic_reg_maps/common.py6
-rwxr-xr-xhost/lib/ic_reg_maps/gen_lmk04816_regs.py20
-rwxr-xr-xhost/lib/ic_reg_maps/gen_lmx2572_regs.py663
-rwxr-xr-xhost/lib/ic_reg_maps/gen_zbx_cpld_regs.py450
5 files changed, 1147 insertions, 2 deletions
diff --git a/host/lib/ic_reg_maps/CMakeLists.txt b/host/lib/ic_reg_maps/CMakeLists.txt
index 42ac4d051..039614c03 100644
--- a/host/lib/ic_reg_maps/CMakeLists.txt
+++ b/host/lib/ic_reg_maps/CMakeLists.txt
@@ -128,6 +128,11 @@ LIBUHD_PYTHON_GEN_SOURCE(
)
LIBUHD_PYTHON_GEN_SOURCE(
+ ${CMAKE_CURRENT_SOURCE_DIR}/gen_lmx2572_regs.py
+ ${CMAKE_CURRENT_BINARY_DIR}/lmx2572_regs.hpp
+)
+
+LIBUHD_PYTHON_GEN_SOURCE(
${CMAKE_CURRENT_SOURCE_DIR}/gen_lmk04828_regs.py
${CMAKE_CURRENT_BINARY_DIR}/lmk04828_regs.hpp
)
@@ -142,4 +147,9 @@ LIBUHD_PYTHON_GEN_SOURCE(
${CMAKE_CURRENT_BINARY_DIR}/rhodium_cpld_regs.hpp
)
+LIBUHD_PYTHON_GEN_SOURCE(
+ ${CMAKE_CURRENT_SOURCE_DIR}/gen_zbx_cpld_regs.py
+ ${CMAKE_CURRENT_BINARY_DIR}/zbx_cpld_regs.hpp
+ )
+
set(LIBUHD_PYTHON_GEN_SOURCE_DEPS)
diff --git a/host/lib/ic_reg_maps/common.py b/host/lib/ic_reg_maps/common.py
index 96b63410f..59a24d298 100755
--- a/host/lib/ic_reg_maps/common.py
+++ b/host/lib/ic_reg_maps/common.py
@@ -136,7 +136,7 @@ class ${name}_t:
% if reg.is_array:
self.${reg.get_name()} = [self.${reg.get_name()}_t.${reg.get_default()},] * ${reg.get_array_len()}
% else:
- self.${reg.get_name()} = ${reg.get_default()}
+ self.${reg.get_name()} = self.${reg.get_name()}_t.${reg.get_default()}
% endif
% else:
% if reg.is_array:
@@ -156,7 +156,11 @@ class ${name}_t:
if self._state is None:
self._state = ${name}_t()
% for reg in regs:
+ % if reg.is_array:
+ self._state.${reg.get_name()} = self.${reg.get_name()}.copy()
+ % else:
self._state.${reg.get_name()} = self.${reg.get_name()}
+ % endif
% endfor
def get_changed_addrs(self):
diff --git a/host/lib/ic_reg_maps/gen_lmk04816_regs.py b/host/lib/ic_reg_maps/gen_lmk04816_regs.py
index ccc82804f..1f6db9c5b 100755
--- a/host/lib/ic_reg_maps/gen_lmk04816_regs.py
+++ b/host/lib/ic_reg_maps/gen_lmk04816_regs.py
@@ -380,11 +380,29 @@ uint32_t get_reg(int addr){
}
"""
+PY_BODY_TMPL = """\
+def get_reg(self, addr):
+ reg = 0
+ % for addr in sorted(set(map(lambda r: r.get_addr(), regs))):
+ <% if_state = 'if' if loop.index == 0 else 'elif' %>
+ ${if_state} addr == ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ % if reg.get_enums():
+ reg |= (self.${reg.get_name()}.value & ${reg.get_mask()}) << ${reg.get_shift()}
+ % else:
+ reg |= (self.${reg.get_name()} & ${reg.get_mask()}) << ${reg.get_shift()}
+ % endif
+ % endfor
+ % endfor
+ return reg
+
+"""
+
if __name__ == '__main__':
import common; common.generate(
name='lmk04816_regs',
regs_tmpl=REGS_TMPL,
body_tmpl=BODY_TMPL,
+ py_body_tmpl=PY_BODY_TMPL,
file=__file__,
)
-
diff --git a/host/lib/ic_reg_maps/gen_lmx2572_regs.py b/host/lib/ic_reg_maps/gen_lmx2572_regs.py
new file mode 100755
index 000000000..0995f57e2
--- /dev/null
+++ b/host/lib/ic_reg_maps/gen_lmx2572_regs.py
@@ -0,0 +1,663 @@
+#!/usr/bin/env python
+#
+# Copyright 2019 Ettus Research, a National Instruments Brand
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+"""
+Register map for LMX2572
+"""
+
+########################################################################
+# Template for raw text data describing registers
+# name addr[bit range inclusive] default optional enums
+########################################################################
+
+REGS_TMPL = """\
+########################################################################
+## address 0
+########################################################################
+powerdown 0[0] 0 normal_operation, power_down
+reset 0[1] 0 normal_operation, reset
+muxout_ld_sel 0[2] 1 register_readback, lock_detect
+fcal_en 0[3] 1 invalid, enable
+reg0_reserved0 0[4] 1
+fcal_lpfd_adj 0[5:6] 0
+fcal_hpfd_adj 0[7:8] 0
+out_mute 0[9] 1 disabled, muted
+reg0_reserved1 0[10] 0
+add_hold 0[11] 0
+reg0_reserved2 0[12:13] 0x2
+vco_phase_sync_en 0[14] 0 normal_operation, phase_sync_mode
+ramp_en 0[15] 0 normal_operation, frequency_ramping
+########################################################################
+## address 1
+########################################################################
+cal_clk_div 1[0:2] 0
+reg1_reserved0 1[3:15] 0x101
+########################################################################
+## address 2
+########################################################################
+reg2_reserved0 2[0:15] 0x500
+########################################################################
+## address 3
+########################################################################
+reg3_reserved0 3[0:15] 0x782
+########################################################################
+## address 4
+########################################################################
+reg4_reserved0 4[0:15] 0xA43
+########################################################################
+## address 5
+########################################################################
+reg5_reserved0 5[0:10] 0xC8
+ipbuf_term 5[11] 0 normal_operation, internally_terminated
+ipbuf_type 5[12] 1 differential, single_ended
+reg5_reserved1 5[13:15] 1
+########################################################################
+## address 6
+########################################################################
+reg6_reserved0 6[0:10] 0x2
+ldo_dly 6[11:15] 0x19
+########################################################################
+## address 7
+########################################################################
+reg7_reserved0 7[0:13] 0xB2
+out_force 7[14] 0 use_out_mute, no_mute
+reg7_reserved1 7[15] 0
+########################################################################
+## address 8
+########################################################################
+reg8_reserved0 8[0:10] 0
+vco_capctrl_force 8[11] 0 normal_operation, use_vco_capctrl
+reg8_reserved1 8[12:13] 0x2
+vco_daciset_force 8[14] 0 normal_operation, use_vco_daciset
+reg8_reserved2 8[15] 0
+########################################################################
+## address 9
+########################################################################
+reg9_reserved0 9[0:11] 0x4
+osc_2x 9[12] 0 disabled, enabled
+reg9_reserved1 9[13] 0
+mult_hi 9[14] 0 less_than_equal_to_100M, greater_than_100M
+reg9_reserved2 9[15] 0
+########################################################################
+## address 10
+########################################################################
+reg10_reserved0 10[0:6] 0x78
+mult 10[7:11] 1
+reg10_reserved1 10[12:15] 1
+########################################################################
+## address 11
+########################################################################
+reg11_reserved0 11[0:3] 0x8
+pll_r 11[4:11] 1
+reg11_reserved1 11[12:15] 0xB
+########################################################################
+## address 12
+########################################################################
+pll_r_pre 12[0:11] 1
+reg12_reserved0 12[12:15] 0x5
+########################################################################
+## address 13
+########################################################################
+reg13_reserved0 13[0:15] 0x4000
+########################################################################
+## address 14
+########################################################################
+reg14_reserved0 14[0:2] 0x0
+cpg 14[3:6] 0x8
+reg14_reserved1 14[7:15] 0x30
+########################################################################
+## address 15
+########################################################################
+reg15_reserved0 15[0:15] 0x60E
+########################################################################
+## address 16
+########################################################################
+vco_daciset 16[0:8] 0x80
+reg16_reserved0 16[9:15] 0
+########################################################################
+## address 17
+########################################################################
+vco_daciset_strt 17[0:8] 0x96
+reg17_reserved0 17[9:15] 0
+########################################################################
+## address 18
+########################################################################
+reg18_reserved0 18[0:15] 0x64
+########################################################################
+## address 19
+########################################################################
+vco_capctrl 19[0:7] 0xB7
+reg19_reserved0 19[8:15] 0x27
+########################################################################
+## address 20
+########################################################################
+reg20_reserved0 20[0:9] 0x48
+vco_sel_force 20[10] 0 disabled, enabled
+vco_sel 20[11:13] 0x6
+reg20_reserved1 20[14:15] 1
+########################################################################
+## address 21
+########################################################################
+reg21_reserved0 21[0:15] 0x409
+########################################################################
+## address 22
+########################################################################
+reg22_reserved0 22[0:15] 1
+########################################################################
+## address 23
+########################################################################
+reg23_reserved0 23[0:15] 0x7C
+########################################################################
+## address 24
+########################################################################
+reg24_reserved0 24[0:15] 0x71A
+########################################################################
+## address 25
+########################################################################
+reg25_reserved0 25[0:15] 0x624
+########################################################################
+## address 26
+########################################################################
+reg26_reserved0 26[0:15] 0x808
+########################################################################
+## address 27
+########################################################################
+reg27_reserved0 27[0:15] 0x2
+########################################################################
+## address 28
+########################################################################
+reg28_reserved0 28[0:15] 0x488
+########################################################################
+## address 29
+########################################################################
+reg29_reserved0 29[0:15] 0x18C6
+########################################################################
+## address 30
+########################################################################
+reg30_reserved0 30[0:15] 0x18C6
+########################################################################
+## address 31
+########################################################################
+reg31_reserved0 31[0:15] 0xC3E6
+########################################################################
+## address 32
+########################################################################
+reg32_reserved0 32[0:15] 0x5BF
+########################################################################
+## address 33
+########################################################################
+reg33_reserved0 33[0:15] 0x1E01
+########################################################################
+## address 34
+########################################################################
+pll_n_upper_3_bits 34[0:2] 0
+reg34_reserved0 34[3:15] 0x2
+########################################################################
+## address 35
+########################################################################
+reg35_reserved0 35[0:15] 0x4
+########################################################################
+## address 36
+########################################################################
+pll_n_lower_16_bits 36[0:15] 0x28
+########################################################################
+## address 37
+########################################################################
+reg37_reserved0 37[0:7] 0x5
+pfd_dly_sel 37[8:13] 0x2
+reg37_reserved1 37[14] 0
+mash_seed_en 37[15] 0 disabled, enabled
+########################################################################
+## address 38
+########################################################################
+pll_den_upper 38[0:15] 0xFFFF
+########################################################################
+## address 39
+########################################################################
+pll_den_lower 39[0:15] 0xFFFF
+########################################################################
+## address 40
+########################################################################
+mash_seed_upper 40[0:15] 0
+########################################################################
+## address 41
+########################################################################
+mash_seed_lower 41[0:15] 0
+########################################################################
+## address 42
+########################################################################
+pll_num_upper 42[0:15] 0
+########################################################################
+## address 43
+########################################################################
+pll_num_lower 43[0:15] 0
+########################################################################
+## address 44
+########################################################################
+mash_order 44[0:2] 0x2 interger_mode, first_order, second_order, third_order, fourth_order
+reg44_reserved0 44[3:4] 0
+mash_reset_n 44[5] 1 reset, normal_operation
+outa_pd 44[6] 0 normal_operation, power_down
+outb_pd 44[7] 1 normal_operation, power_down
+outa_pwr 44[8:13] 0x22
+reg44_reserved1 44[14:15] 0
+########################################################################
+## address 45
+########################################################################
+outb_pwr 45[0:5] 0x22
+register45_reserved0 45[6:10] 0x18
+outa_mux 45[11:12] 0 channel_divider, vco, not_used, high_impedance
+register45_reserved1 45[13:15] 0x6
+########################################################################
+## address 46
+########################################################################
+outb_mux 46[0:1] 0 channel_divider, vco, sysref, high_impedance
+register46_reserved0 46[2:15] 0x1FC
+########################################################################
+## address 47
+########################################################################
+reg47_reserved0 47[0:15] 0x300
+########################################################################
+## address 48
+########################################################################
+reg48_reserved0 48[0:15] 0x3E0
+########################################################################
+## address 49
+########################################################################
+reg49_reserved0 49[0:15] 0x4180
+########################################################################
+## address 50
+########################################################################
+reg50_reserved0 50[0:15] 0x80
+########################################################################
+## address 51
+########################################################################
+reg51_reserved0 51[0:15] 0x80
+########################################################################
+## address 52
+########################################################################
+reg52_reserved0 52[0:15] 0x420
+########################################################################
+## address 53
+########################################################################
+reg53_reserved0 53[0:15] 0
+########################################################################
+## address 54
+########################################################################
+reg54_reserved0 54[0:15] 0
+########################################################################
+## address 55
+########################################################################
+reg55_reserved0 55[0:15] 0
+########################################################################
+## address 56
+########################################################################
+reg56_reserved0 56[0:15] 0
+########################################################################
+## address 57
+########################################################################
+reg57_reserved0 57[0:15] 0
+########################################################################
+## address 58
+########################################################################
+reg58_reserved0 58[0:8] 1
+inpin_fmt 58[9:11] 0 SYNC_EQUALS_SYSREFREQ_EQUALS_CMOS, SYNC_EQUALS_LVDS_SYSREFREQ_EQUAL_CMOS, SYNC_EQUALS_CMOS_SYSREFREQ_EQUAL_LVDS, SYNC_EQUALS_SYSREFREQ_EQUALS_LVDS, SYNC_EQUALS_SYSREFREQ_EQUALS_CMOS2, SYNC_EQUALS_LVDSFILTERED_SYSREFREQ_EQUALS_CMOS, SYNC_EQUALS_CMOS_SYSREFREQ_EQUALS_LVDSFILTERED, SYNC_EQUALS_SYSREFREQ_EQUALS_LVDSFILTERED
+inpin_lvl 58[12:13] 0 vin_divide_by_4, vin, vin_divide_by_2, invalid
+inpin_hyst 58[14] 0 disabled, enabled
+inpin_ignore 58[15] 1
+########################################################################
+## address 59
+########################################################################
+ld_type 59[0] 1 vcocal, vtune_and_vcocal
+reg59_reserved0 59[1:15] 0
+########################################################################
+## address 60
+########################################################################
+ld_dly 60[0:15] 0x3E8
+########################################################################
+## address 61
+########################################################################
+reg61_reserved0 61[0:15] 0xA8
+########################################################################
+## address 62
+########################################################################
+reg62_reserved0 62[0:9] 0xAF
+dblbuf_en_0 62[10] 0 disabled, enabled
+dblbuf_en_1 62[11] 0 disabled, enabled
+dblbuf_en_2 62[12] 0 disabled, enabled
+dblbuf_en_3 62[13] 0 disabled, enabled
+dblbuf_en_4 62[14] 0 disabled, enabled
+dblbuf_en_5 62[15] 0 disabled, enabled
+########################################################################
+## address 63
+########################################################################
+reg63_reserved0 63[0:15] 0
+########################################################################
+## address 64
+########################################################################
+reg64_reserved0 64[0:15] 0x1388
+########################################################################
+## address 65
+########################################################################
+reg65_reserved0 65[0:15] 0
+########################################################################
+## address 66
+########################################################################
+reg66_reserved0 6[0:15] 0x1F4
+########################################################################
+## address 67
+########################################################################
+reg67_reserved0 67[0:15] 0
+########################################################################
+## address 68
+########################################################################
+reg68_reserved0 68[0:15] 0x3E8
+########################################################################
+## address 69
+########################################################################
+mash_rst_count_upper 69[0:15] 0
+########################################################################
+## address 70
+########################################################################
+mash_rst_count_lower 70[0:15] 0xC350
+########################################################################
+## address 71
+########################################################################
+reg71_reserved0 71[0:1] 1
+sysref_repeat 71[2] 0 master_mode, repeater_mode
+sysref_en 71[3] 0 disabled, enabled
+sysref_pulse 71[4] 0 disabled, enabled
+sysref_div_pre 71[5:7] 0x4 divide_by_2=2, divide_by_4=4
+reg71_reserved1 71[8:15] 0
+########################################################################
+## address 72
+########################################################################
+sysref_div 72[0:10] 1
+reg72_reserved0 72[11:15] 0
+########################################################################
+## address 73
+########################################################################
+jesd_dac1_ctrl 73[0:5] 0x3F
+jesd_dac2_ctrl 73[6:11] 0
+reg73_reserved0 73[12:15] 0
+########################################################################
+## address 74
+########################################################################
+jesd_dac3_ctrl 74[0:5] 0
+jesd_dac4_ctrl 74[6:11] 0
+sysref_pulse_cnt 74[12:15] 0
+########################################################################
+## address 75
+########################################################################
+reg75_reserved0 75[0:5] 0
+chdiv 75[6:10] 0 divide_by_2=0, divide_by_4=1, divide_by_8=3, divide_by_16=5, divide_by_32=7, divide_by_64=9, divide_by_128=12, divide_by_256=14
+reg75_reserved1 75[11:15] 1
+########################################################################
+## address 76
+########################################################################
+reg76_reserved0 76[0:15] 0xC
+########################################################################
+## address 77
+########################################################################
+reg77_reserved0 77[0:15] 0
+########################################################################
+## address 78
+########################################################################
+reg78_reserved0 78[0] 0
+vco_capctrl_strt 78[1:8] 0x32
+quick_recal_en 78[9] 0
+reg78_reserved1 78[10] 0
+ramp_thresh_33rd 78[11] 0
+reg78_reserved2 78[12:15] 0
+########################################################################
+## address 79
+########################################################################
+ramp_thresh_upper 79[0:15] 0
+########################################################################
+## address 80
+########################################################################
+ramp_thresh_lower 80[0:15] 0
+########################################################################
+## address 81
+########################################################################
+ramp_limit_high_33rd 81[0] 0
+reg81_reserved0 81[1:15] 0
+########################################################################
+## address 82
+########################################################################
+ramp_limit_high_upper 82[0:15] 0
+########################################################################
+## address 83
+########################################################################
+ramp_limit_high_lower 83[0:15] 0
+########################################################################
+## address 84
+########################################################################
+ramp_limit_low_33rd 84[0] 0
+reg84_reserved0 84[1:15] 0
+########################################################################
+## address 85
+########################################################################
+ramp_limit_low_upper 85[0:15] 0
+########################################################################
+## address 86
+########################################################################
+ramp_limit_low_lower 86[0:15] 0
+########################################################################
+## address 87
+########################################################################
+reg87_reserved0 87[0:15] 0
+########################################################################
+## address 88
+########################################################################
+reg88_reserved0 88[0:15] 0
+########################################################################
+## address 89
+########################################################################
+reg89_reserved0 89[0:15] 0
+########################################################################
+## address 90
+########################################################################
+reg90_reserved0 90[0:15] 0
+########################################################################
+## address 91
+########################################################################
+reg91_reserved0 91[0:15] 0
+########################################################################
+## address 92
+########################################################################
+reg92_reserved0 92[0:15] 0
+########################################################################
+## address 93
+########################################################################
+reg93_reserved0 93[0:15] 0
+########################################################################
+## address 94
+########################################################################
+reg94_reserved0 94[0:15] 0
+########################################################################
+## address 95
+########################################################################
+reg95_reserved0 95[0:15] 0
+########################################################################
+## address 96
+########################################################################
+reg96_reserved0 96[0:1] 0
+ramp_burst_count 96[2:14] 0
+ramp_burst_en 96[15] 0 disabled, enabled
+########################################################################
+## address 97
+########################################################################
+ramp_burst_trig 97[0:1] 0 ramp_transistion=0, trigger_a=1, trigger_b=2
+reg97_reserved0 97[2] 0
+ramp_triga 97[3:6] 0 disabled=0, rampclk_rising_edge=1, rampdir_rising_edge=2, always_triggered=4, rampclk_falling_edge=9, rampdir_falling_edge=10
+ramp_trgb 97[7:10] 0 disabled=0, rampclk_rising_edge=1, rampdir_rising_edge=2, always_triggered=4, rampclk_falling_edge=9, rampdir_falling_edge=10
+reg97_reserved1 97[11:14] 0
+ramp0_rst 97[15] 0 disabled, reset
+########################################################################
+## address 98
+########################################################################
+ramp0_dly 98[0] 0
+reg98_reserved0 98[1] 0
+ramp0_inc_upper_14 98[15:2] 0
+########################################################################
+## address 99
+########################################################################
+ramp0_inc_lower 99[0:15] 0
+########################################################################
+## address 100
+########################################################################
+ramp0_len 100[0:15] 0
+########################################################################
+## address 101
+########################################################################
+ramp0_next_trig 101[0:1] 0 timeout_counter, trigger_a, trigger_b
+reg101_reserved0 101[2:3] 0
+ramp0_next 101[4] 0 ramp0, ramp1
+ramp1_rst 101[5] 0 disabled, reset
+ramp1_dly 101[6] 0
+reg101_reserved1 101[7:15] 0
+########################################################################
+## address 102
+########################################################################
+ramp1_inc_upper_14 102[13:0] 0
+reg102_reserved0 102[14:15] 0
+########################################################################
+## address 103
+########################################################################
+ramp1_inc_lower 103[0:15] 0
+########################################################################
+## address 104
+########################################################################
+ramp1_len 104[0:15] 0
+########################################################################
+## address 105
+########################################################################
+ramp1_next_trig 105[0:1] 0 timeout_counter, trigger_a, trigger_b
+reg105_reserved0 105[2:3] 0
+ramp1_next 105[4] 0 ramp0, ramp1
+ramp_manual 105[5] 0 automatic_ramping, manual_ramping
+ramp_dly_cnt 105[6:15] 0x111
+########################################################################
+## address 106
+########################################################################
+ramp_scale_count 106[0:2] 0x7
+reg106_reserved0 106[3] 0
+ramp_trig_cal 106[4] 0 disabled, enabled
+reg106_reserved1 106[5:15] 0
+########################################################################
+## address 114
+########################################################################
+fsk_mode_sel 114[0:1] 0 unused=0,fsk_spi=2, fsk_spi_fast=3
+fsk_spi_dev_sel 114[2:4] 0
+fsk_spi_level 114[5:6] 0 disabled, 2fsk, 4fsk, 8fsk
+reg114_reserved0 114[7:9] 0
+fsk_en 114[10] 0 disabled, enabled
+reg114_reserved1 114[11:15] 0xF
+########################################################################
+## address 115
+########################################################################
+reg115_reserved0 115[0:2] 0
+fsk_dev_scale 115[3:7] 0
+reg115_reserved1 115[8:15] 0
+########################################################################
+## address 116
+########################################################################
+fsk_dev0 116[0:15] 0
+########################################################################
+## address 117
+########################################################################
+fsk_dev1 117[0:15] 0
+########################################################################
+## address 118
+########################################################################
+fsk_dev2 118[0:15] 0
+########################################################################
+## address 119
+########################################################################
+fsk_dev3 119[0:15] 0
+########################################################################
+## address 120
+########################################################################
+fsk_dev4 120[0:15] 0
+########################################################################
+## address 121
+########################################################################
+fsk_dev5 121[0:15] 0
+########################################################################
+## address 122
+########################################################################
+fsk_dev6 122[0:15] 0
+########################################################################
+## address 123
+########################################################################
+fsk_dev7 123[0:15] 0
+########################################################################
+## address 124
+########################################################################
+fsk_spi_dev 124[0:15] 0
+########################################################################
+## address 125
+########################################################################
+reg125 125[0:16] 0x2288
+"""
+########################################################################
+# Template for methods in the body of the struct
+########################################################################
+
+BODY_TMPL = """\
+uint16_t get_reg(int addr){
+ uint16_t reg = 0;
+ switch(addr){
+ % for addr in sorted(set(map(lambda r: r.get_addr(), regs))):
+ case ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ reg |= (uint16_t(${reg.get_name()}) & ${reg.get_mask()}) << ${reg.get_shift()};
+ % endfor
+ break;
+ % endfor
+ }
+ return reg;
+}
+
+std::set<uint8_t> get_ro_regs()
+{
+ return {107, 108, 109, 110, 111, 112, 113};
+}
+
+int get_num_regs()
+{
+ return 126;
+}
+"""
+
+PY_BODY_TMPL = """\
+def get_reg(self, addr):
+ reg = 0
+ % for addr in sorted(set(map(lambda r: r.get_addr(), regs))):
+ <% if_state = 'if' if loop.index == 0 else 'elif' %>
+ ${if_state} addr == ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ % if reg.get_enums():
+ reg |= (self.${reg.get_name()}.value & ${reg.get_mask()}) << ${reg.get_shift()}
+ % else:
+ reg |= (self.${reg.get_name()} & ${reg.get_mask()}) << ${reg.get_shift()}
+ % endif
+ % endfor
+ % endfor
+ return reg
+
+"""
+
+if __name__ == '__main__':
+ import common
+ common.generate(
+ name='lmx2572_regs',
+ regs_tmpl=REGS_TMPL,
+ body_tmpl=BODY_TMPL,
+ py_body_tmpl=PY_BODY_TMPL,
+ file=__file__,
+ )
diff --git a/host/lib/ic_reg_maps/gen_zbx_cpld_regs.py b/host/lib/ic_reg_maps/gen_zbx_cpld_regs.py
new file mode 100755
index 000000000..0efc8a4d7
--- /dev/null
+++ b/host/lib/ic_reg_maps/gen_zbx_cpld_regs.py
@@ -0,0 +1,450 @@
+# Copyright 2020 Ettus Research, a National Instruments Brand
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+"""
+Register map for the ZBX CPLD. Note that the ground truth for this register map
+is in the fpga/usrp3/top/x400/dboards/zbx/cpld subdirectory, and can be looked
+up in fpga/usrp3/top/x400/dboards/zbx/cpld/doc/ZBX_CPLD.htm
+
+This CPLD regmap works with RevB daughterboards only.
+"""
+
+########################################################################
+# Template for raw text data describing registers
+# name addr[bit range inclusive] default optional enums
+########################################################################
+REGS_TMPL = """\
+########################################################################
+## SLAVE SETUP
+########################################################################
+BOARD_ID 0x0000[0:15] 0
+REVISION 0x0004[0:31] 0
+OLDEST_COMPAT_REVISION 0x0008[0:31] 0
+SCRATCH 0x000C[0:31] 0
+GIT_HASH 0x0010[0:31] 0
+ENABLE_TX_POS_7V0 0x0040[0] 0 disable, enable
+ENABLE_RX_POS_7V0 0x0040[1] 0 disable, enable
+ENABLE_POS_3V3 0x0040[2] 0 disable, enable
+P7V_B_STATUS 0x0044[0] 0
+P7V_A_STATUS 0x0044[1] 0
+PLL_REF_CLOCK_ENABLE 0x0048[0] 0 disable, enable
+########################################################################
+## ATR
+########################################################################
+CURRENT_RF0_CONFIG 0x1000[0:7] 1
+CURRENT_RF1_CONFIG 0x1000[8:15] 1
+CURRENT_RF0_DSA_CONFIG 0x1000[23:16] 1
+CURRENT_RF1_DSA_CONFIG 0x1000[31:24] 1
+RF0_OPTION 0x1004[0:1] 0 sw_defined, classic_atr, fpga_state
+RF1_OPTION 0x1004[8:9] 0 sw_defined, classic_atr, fpga_state
+RF0_DSA_OPTION 0x1004[17:16] 0 sw_defined, classic_atr, fpga_state
+RF1_DSA_OPTION 0x1004[25:24] 0 sw_defined, classic_atr, fpga_state
+SW_RF0_CONFIG 0x1008[0:7] 0
+SW_RF1_CONFIG 0x1008[8:15] 0
+SW_RF0_DSA_CONFIG 0x1008[23:16] 0
+SW_RF1_DSA_CONFIG 0x1008[31:24] 0
+########################################################################
+## LO SPI
+########################################################################
+DATA 0x1020[0:15] 0
+ADDRESS 0x1020[16:22] 0
+READ_FLAG 0x1020[23] 1 write, read
+LO_SELECT 0x1020[24:26] 0 TX0_LO1, TX0_LO2, TX1_LO1, TX1_LO2, RX0_LO1, RX0_LO2, RX1_LO1, RX1_LO2
+START_TRANSACTION 0x1020[28] 0 disable, enable
+SPI_READY 0x1020[30] 0
+DATA_VALID 0x1020[31] 0
+########################################################################
+## LO SYNC
+########################################################################
+PULSE_TX0_LO1_SYNC 0x1024[0] 0
+PULSE_TX0_LO2_SYNC 0x1024[1] 0
+PULSE_TX1_LO1_SYNC 0x1024[2] 0
+PULSE_TX1_LO2_SYNC 0x1024[3] 0
+PULSE_RX0_LO1_SYNC 0x1024[4] 0
+PULSE_RX0_LO2_SYNC 0x1024[5] 0
+PULSE_RX1_LO1_SYNC 0x1024[6] 0
+PULSE_RX1_LO2_SYNC 0x1024[7] 0
+BYPASS_SYNC_REGISTER 0x1024[8] 0 disable, enable
+########################################################################
+## LED CONTROL
+########################################################################
+RX0_RX_LED[256] 0x1400[0] 0 disable, enable
+RX0_TRX_LED[256] 0x1400[1] 0 disable, enable
+TX0_TRX_LED[256] 0x1400[2] 0 disable, enable
+RX1_RX_LED[256] 0x1400[16] 0 disable, enable
+RX1_TRX_LED[256] 0x1400[17] 0 disable, enable
+TX1_TRX_LED[256] 0x1400[18] 0 disable, enable
+########################################################################
+## PATH CONTROL - TX 0
+########################################################################
+TX0_IF2_1_2[256] 0x2000[0] 0 filter_2, filter_1
+TX0_IF1_3[256] 0x2000[2:3] 0 filter_0_3, filter_4, filter_6, filter_5
+TX0_IF1_4[256] 0x2000[4:5] 0 termination, filter_1, filter_2, filter_3
+TX0_IF1_5[256] 0x2000[6:7] 0 filter_3, filter_2, filter_1, termination
+TX0_IF1_6[256] 0x2000[8:9] 0 filter_5, filter_6, filter_4, filter_0_3
+TX0_7[256] 0x2000[10:11] 0 termination, no_connect, highband, lowband
+TX0_RF_8[256] 0x2000[12:14] 0 invalid_0, rf_3, rf_1, invalid_1, rf_2
+TX0_RF_9[256] 0x2000[16:17] 0 rf_3, rf_1, rf_2, highband
+TX0_ANT_10[256] 0x2000[18:19] 0 bypass_amp, cal_loopback, lowband_amp, highband_amp
+TX0_ANT_11[256] 0x2000[20:21] 0 tx_rx, highband_amp, lowband_amp, bypass_amp
+TX0_LO_13[256] 0x2000[24] 0 internal, external
+TX0_LO_14[256] 0x2000[26] 0 external, internal
+########################################################################
+## PATH CONTROL - TX 1
+########################################################################
+TX1_IF2_1_2[256] 0x2400[0] 0 filter_1, filter_2
+TX1_IF1_3[256] 0x2400[2:3] 0 filter_5, filter_6, filter_4, filter_0_3
+TX1_IF1_4[256] 0x2400[4:5] 0 filter_3, filter_2, filter_1, termination
+TX1_IF1_5[256] 0x2400[6:7] 0 termination, filter_1, filter_2, filter_3
+TX1_IF1_6[256] 0x2400[8:9] 0 filter_0_3, filter_4, filter_6, filter_5
+TX1_7[256] 0x2400[10:11] 0 lowband, highband, no_connect, termination
+TX1_RF_8[256] 0x2400[12:14] 0 invalid_0, rf_2, rf_1, invalid_1, rf_3
+TX1_RF_9[256] 0x2400[16:17] 0 highband, rf_2, rf_1, rf_3
+TX1_ANT_10[256] 0x2400[18:19] 0 highband_amp, lowband_amp, bypass_amp, cal_loopback
+TX1_ANT_11[256] 0x2400[20:21] 0 tx_rx, bypass_amp, lowband_amp, highband_amp
+TX1_LO_13[256] 0x2400[24] 0 external, internal
+TX1_LO_14[256] 0x2400[26] 0 internal, external
+########################################################################
+## PATH CONTROL - RX 0
+########################################################################
+RX0_ANT_1[256] 0x2800[0:1] 0 cal_loopback, termination, tx_rx, rx2
+RX0_2[256] 0x2800[2] 0 highband, lowband
+RX0_RF_3[256] 0x2800[4:6] 0 invalid_0, rf_2, rf_1, invalid_1, rf_3
+RX0_4[256] 0x2800[8] 0 lowband, highband
+RX0_IF1_5[256] 0x2800[10:11] 0 filter_4, filter_3, filter_2, filter_1
+RX0_IF1_6[256] 0x2800[12:13] 0 filter_1, filter_2, filter_3, filter_4
+RX0_IF2_7_8[256] 0x2800[14] 0 filter_2, filter_1
+RX0_LO_9[256] 0x2800[16] 0 internal, external
+RX0_LO_10[256] 0x2800[18] 0 internal, external
+RX0_RF_11[256] 0x2800[20:22] 0 invalid_0, rf_3, rf_1, invalid_1, rf_2, invalid_2, invalid_3, invalid_4
+########################################################################
+## PATH CONTROL - RX 1
+########################################################################
+RX1_ANT_1[256] 0x2C00[0:1] 0 cal_loopback, tx_rx, rx2, termination
+RX1_2[256] 0x2C00[2] 0 lowband, highband
+RX1_RF_3[256] 0x2C00[4:6] 0 invalid_0, rf_3, rf_1, invalid_1, rf_2
+RX1_4[256] 0x2C00[8] 0 highband, lowband
+RX1_IF1_5[256] 0x2C00[10:11] 0 filter_1, filter_2, filter_3, filter_4
+RX1_IF1_6[256] 0x2C00[12:13] 0 filter_4, filter_3, filter_2, filter_1
+RX1_IF2_7_8[256] 0x2C00[14] 0 filter_1, filter_2
+RX1_LO_9[256] 0x2C00[16] 0 external, internal
+RX1_LO_10[256] 0x2C00[18] 0 external, internal
+RX1_RF_11[256] 0x2C00[20:22] 0 invalid_0, rf_2, rf_1, invalid_1, rf_3, invalid_2, invalid_3, invalid_4
+########################################################################
+## DSA CONTROL
+########################################################################
+TX0_DSA1[256] 0x3000[0:4] 31
+TX0_DSA2[256] 0x3000[8:12] 31
+TX1_DSA1[256] 0x3400[0:4] 31
+TX1_DSA2[256] 0x3400[8:12] 31
+RX0_DSA1[256] 0x3800[0:3] 15
+RX0_DSA2[256] 0x3800[4:7] 15
+RX0_DSA3_A[256] 0x3800[8:11] 15
+RX0_DSA3_B[256] 0x3800[12:15] 15
+RX1_DSA1[256] 0x3C00[0:3] 15
+RX1_DSA2[256] 0x3C00[4:7] 15
+RX1_DSA3_A[256] 0x3C00[8:11] 15
+RX1_DSA3_B[256] 0x3C00[12:15] 15
+TX0_TABLE_SELECT[256] 0x4000[0:7] 0
+TX1_TABLE_SELECT[256] 0x4400[0:7] 0
+RX0_TABLE_SELECT[256] 0x4800[0:7] 0
+RX1_TABLE_SELECT[256] 0x4C00[0:7] 0
+TX0_TABLE_DSA1[256] 0x5000[0:4] 31
+TX0_TABLE_DSA2[256] 0x5000[8:12] 31
+TX1_TABLE_DSA1[256] 0x5400[0:4] 31
+TX1_TABLE_DSA2[256] 0x5400[8:12] 31
+RX0_TABLE_DSA1[256] 0x5800[0:3] 15
+RX0_TABLE_DSA2[256] 0x5800[4:7] 15
+RX0_TABLE_DSA3_A[256] 0x5800[8:11] 15
+RX0_TABLE_DSA3_B[256] 0x5800[12:15] 15
+RX1_TABLE_DSA1[256] 0x5C00[0:3] 15
+RX1_TABLE_DSA2[256] 0x5C00[4:7] 15
+RX1_TABLE_DSA3_A[256] 0x5C00[8:11] 15
+RX1_TABLE_DSA3_B[256] 0x5C00[12:15] 15
+"""
+
+########################################################################
+# Template for python methods in the body of the struct
+########################################################################
+
+PY_BODY_TMPL = """\
+def get_reg(self, addr):
+ "Return the value of register at address addr"
+ reg = 0
+ # First the regular registers
+ % for addr in sorted(set([r.get_addr() for r in regs if not r.is_array])):
+ if addr == ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ % if reg.get_enums():
+ reg |= (self.${reg.get_name()}.value & ${reg.get_mask()}) << ${reg.get_shift()}
+ % else:
+ reg |= (self.${reg.get_name()} & ${reg.get_mask()}) << ${reg.get_shift()}
+ % endif
+ % endfor
+ % endfor
+ # Now the arrays
+ # We can do this because all arrays have a base address that is a multiple
+ # of 256 (0x100). In other words, this is a hack that only works if you
+ # know exactly what you're doing, which is OK in this case, because its in
+ # this same file as the register map.
+ array_offset = addr % 256
+ base_addr = addr - array_offset
+ index = int(array_offset / 4)
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ if base_addr == ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ <%
+ assert reg.get_array_len() == 256, "Arrays must be length 256!"
+ assert reg.get_addr() % 256 == 0, "Arrays must start at a multiple of 0x100!"
+ %>
+ % if reg.get_enums():
+ reg |= (int(self.${reg.get_name()}[index].value) & ${reg.get_mask()}) << ${reg.get_shift()}
+ % else:
+ reg |= (int(self.${reg.get_name()}[index]) & ${reg.get_mask()}) << ${reg.get_shift()}
+ % endif
+ % endfor
+ % endfor
+ return reg
+
+<%
+ all_addrs = set()
+ for reg in regs:
+ for index in range(reg.get_array_len() if reg.is_array else 1):
+ all_addrs.add(reg.get_addr() + index * reg.get_addr_step_size())
+%>
+def get_all_regs(self):
+ addrs = {
+ % for addr in sorted(all_addrs):
+ ${addr},
+ % endfor
+ }
+ return addrs
+
+def get_addr(self, reg_name):
+ "returns the address of a register with the given name"
+ return {
+ % for reg in regs:
+ '${reg.get_name()}': ${reg.get_addr()},
+ % endfor
+ }[reg_name]
+"""
+
+
+########################################################################
+# Template for C++ methods in the body of the struct
+########################################################################
+BODY_TMPL = """\
+enum class zbx_cpld_field_t {
+ % for addr in sorted(set(map(lambda r: r.get_addr(), regs))):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ ${reg.get_name()},
+ % endfor
+ % endfor
+};
+
+zbx_cpld_field_t get_field_type(const std::string& field_name) {
+ % for addr in sorted(set(map(lambda r: r.get_addr(), regs))):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ if (field_name == "${reg.get_name()}") {
+ return zbx_cpld_field_t::${reg.get_name()};
+ } else
+ % endfor
+ % endfor
+ {
+ UHD_ASSERT_THROW(false);
+ }
+}
+
+uint32_t get_array_size(zbx_cpld_field_t field) {
+ switch(field) {
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ case zbx_cpld_field_t::${reg.get_name()}:
+ return uint32_t(${reg.get_name()}.size());
+ % endfor
+ % endfor
+ default:
+ UHD_ASSERT_THROW(false);
+ return 0;
+ }
+}
+
+uint32_t get_field(zbx_cpld_field_t field) {
+ switch(field) {
+ % for addr in sorted(set([r.get_addr() for r in regs if not r.is_array])):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ case zbx_cpld_field_t::${reg.get_name()}:
+ return uint32_t(${reg.get_name()});
+ % endfor
+ % endfor
+ default:
+ UHD_ASSERT_THROW(false);
+ return 0;
+ }
+}
+
+uint32_t get_field(zbx_cpld_field_t field, const size_t idx) {
+ switch(field) {
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ case zbx_cpld_field_t::${reg.get_name()}:
+ return uint32_t(${reg.get_name()}[idx]);
+ % endfor
+ % endfor
+ default:
+ UHD_ASSERT_THROW(false);
+ return 0;
+ }
+}
+
+void set_field(zbx_cpld_field_t field, uint32_t value) {
+ switch(field) {
+ % for addr in sorted(set([r.get_addr() for r in regs if not r.is_array])):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ case zbx_cpld_field_t::${reg.get_name()}:
+ ${reg.get_name()} = static_cast<${reg.get_type()}>(value);
+ break;
+ % endfor
+ % endfor
+ default:
+ UHD_ASSERT_THROW(false);
+ }
+}
+
+void set_field(zbx_cpld_field_t field, uint32_t value, const size_t idx)
+{
+ switch(field) {
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ case zbx_cpld_field_t::${reg.get_name()}:
+ ${reg.get_name()}[idx] = static_cast<${reg.get_type()}>(value);
+ break;
+ % endfor
+ % endfor
+ default:
+ UHD_ASSERT_THROW(false);
+ }
+}
+
+uint32_t get_reg(uint16_t addr)
+{
+ uint32_t reg = 0;
+ // First the regular registers
+ switch(addr) {
+ % for addr in sorted(set([r.get_addr() for r in regs if not r.is_array])):
+ case ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ reg |= (uint32_t(${reg.get_name()}) & ${reg.get_mask()}) << ${reg.get_shift()};
+ % endfor
+ break;
+ % endfor
+ default:
+ break;
+ }
+ // Now the arrays
+ // We can do this because all arrays have a base address that is a multiple
+ // of 256 (0x100). In other words, this is a hack that only works if you
+ // know exactly what you're doing, which is OK in this case, because it's in
+ // this same file as the register map.
+ const uint16_t array_offset = addr % 256;
+ const uint16_t base_addr = addr - array_offset;
+ const size_t index = array_offset / 4;
+ switch(base_addr) {
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ case ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ <% assert reg.get_array_len() == 256, "Arrays must be length 256!" %>
+ <% assert reg.get_addr() % 256 == 0, "Arrays must start at a multiple of 0x100!" %>
+ reg |= (uint32_t(${reg.get_name()}[index]) & ${reg.get_mask()}) << ${reg.get_shift()};
+ % endfor
+ break;
+ % endfor
+ default:
+ break;
+ }
+ return reg;
+}
+
+void set_reg(uint16_t addr, uint32_t val)
+{
+ switch(addr) {
+ % for addr in sorted(set([r.get_addr() for r in regs if not r.is_array])):
+ case ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ ${reg.get_name()} = static_cast<${reg.get_type()}>((val & (${reg.get_mask()} << ${reg.get_shift()})) >> ${reg.get_shift()});
+ % endfor
+ break;
+ % endfor
+ default:
+ break;
+ }
+ // Now the arrays
+ // We can do this because all arrays have a base address that is a multiple
+ // of 256 (0x100). In other words, this is a hack that only works if you
+ // know exactly what you're doing, which is OK in this case, because it's in
+ // this same file as the register map.
+ const uint16_t array_offset = addr % 256;
+ const uint16_t base_addr = addr - array_offset;
+ const size_t index = array_offset / 4;
+ switch(base_addr) {
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ case ${addr}:
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ ${reg.get_name()}[index] = static_cast<${reg.get_type()}>((val & (${reg.get_mask()} << ${reg.get_shift()})) >> ${reg.get_shift()});
+ % endfor
+ break;
+ % endfor
+ default: break;
+ }
+}
+
+<%
+ all_addrs = set()
+ for reg in regs:
+ for index in range(reg.get_array_len() if reg.is_array else 1):
+ all_addrs.add(reg.get_addr() + index * reg.get_addr_step_size())
+%>
+std::set<size_t> get_all_addrs()
+{
+ std::set<size_t> addrs;
+ % for addr in sorted(all_addrs):
+ addrs.insert(${addr});
+ % endfor
+ return addrs;
+}
+
+uint16_t get_addr(zbx_cpld_field_t field) {
+ switch(field) {
+ % for addr in sorted(set([r.get_addr() for r in regs if r.is_array])):
+ % for reg in filter(lambda r: r.get_addr() == addr, regs):
+ case zbx_cpld_field_t::${reg.get_name()}:
+ return ${addr};
+ % endfor
+ % endfor
+ default:
+ UHD_ASSERT_THROW(false);
+ return 0;
+ }
+}
+
+uint16_t get_addr(const std::string& reg_name)
+{
+ % for reg in regs:
+ if ("${reg.get_name()}" == reg_name) {
+ return ${reg.get_addr()};
+ }
+ % endfor
+ return 0;
+}
+"""
+
+if __name__ == '__main__':
+ import common
+ common.generate(
+ name='zbx_cpld_regs',
+ regs_tmpl=REGS_TMPL,
+ body_tmpl=BODY_TMPL,
+ py_body_tmpl=PY_BODY_TMPL,
+ file=__file__,
+ )