From 55a95caaef154afed761b66d5dcd6400200ac40a Mon Sep 17 00:00:00 2001 From: YouMin Chen Date: Fri, 25 Oct 2024 18:36:14 +0800 Subject: [PATCH] tools: ddrbin_tool: add ddrbin_tool.py and update to v1.21 20241211 Signed-off-by: YouMin Chen Change-Id: Ia155db269c74aaa35aaab50d21742a16b5f0240b --- tools/ddrbin_param.txt | 72 ++- tools/ddrbin_tool | Bin 106546 -> 0 bytes tools/ddrbin_tool.py | 1401 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1465 insertions(+), 8 deletions(-) delete mode 100755 tools/ddrbin_tool create mode 100644 tools/ddrbin_tool.py diff --git a/tools/ddrbin_param.txt b/tools/ddrbin_param.txt index 0dfdd318..fdbcc507 100644 --- a/tools/ddrbin_param.txt +++ b/tools/ddrbin_param.txt @@ -354,14 +354,70 @@ phy_lp5_dq_vref_when_odtoff= lp5_dq_vref_when_odtoff= lp5_ca_vref_when_odtoff= -ch_mask0= -ch_mask1= -bank_mask0= -bank_mask1= -bank_mask2= -bank_mask3= -rank_mask0= -rank_mask1= +lp4_4x_ch_mask0= +lp4_4x_ch_mask1= +lp4_4x_bank_mask0= +lp4_4x_bank_mask1= +lp4_4x_bank_mask2= +lp4_4x_bank_mask3= +lp4_4x_rank_mask0= +lp4_4x_rank_mask1= +lp5_ch_mask0= +lp5_ch_mask1= +lp5_bank_mask0= +lp5_bank_mask1= +lp5_bank_mask2= +lp5_bank_mask3= +lp5_rank_mask0= +lp5_rank_mask1= +ddr4_ch_mask0= +ddr4_ch_mask1= +ddr4_bank_mask0= +ddr4_bank_mask1= +ddr4_bank_mask2= +ddr4_bank_mask3= +ddr4_rank_mask0= +ddr4_rank_mask1= +lp3_ch_mask0= +lp3_ch_mask1= +lp3_bank_mask0= +lp3_bank_mask1= +lp3_bank_mask2= +lp3_bank_mask3= +lp3_rank_mask0= +lp3_rank_mask1= +ddr3_ch_mask0= +ddr3_ch_mask1= +ddr3_bank_mask0= +ddr3_bank_mask1= +ddr3_bank_mask2= +ddr3_bank_mask3= +ddr3_rank_mask0= +ddr3_rank_mask1= +lp2_ch_mask0= +lp2_ch_mask1= +lp2_bank_mask0= +lp2_bank_mask1= +lp2_bank_mask2= +lp2_bank_mask3= +lp2_rank_mask0= +lp2_rank_mask1= +ddr2_ch_mask0= +ddr2_ch_mask1= +ddr2_bank_mask0= +ddr2_bank_mask1= +ddr2_bank_mask2= +ddr2_bank_mask3= +ddr2_rank_mask0= +ddr2_rank_mask1= +ddr5_ch_mask0= +ddr5_ch_mask1= +ddr5_bank_mask0= +ddr5_bank_mask1= +ddr5_bank_mask2= +ddr5_bank_mask3= +ddr5_rank_mask0= +ddr5_rank_mask1= ddr3_skew_freq_mhz= ddr3_ca0_skew= diff --git a/tools/ddrbin_tool b/tools/ddrbin_tool deleted file mode 100755 index 096255e5e61be3c2c72e412ae49270f3c1d25351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106546 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 diff --git a/tools/ddrbin_tool.py b/tools/ddrbin_tool.py new file mode 100644 index 00000000..889d956e --- /dev/null +++ b/tools/ddrbin_tool.py @@ -0,0 +1,1401 @@ +#!/usr/bin/env python3 +# -*-coding=utf-8-*- +# +# Copyright (C) 2024, Rockchip Electronics Co., Ltd. +# + +import os +import re +import sys +import copy +import getopt +import platform +import struct +from datetime import datetime + +version_max = 5 +update_key_list = [] + +chip_info = 'null' +chip_list = ['px30', 'px30s', 'px3se', 'px5', 'rk1808', 'rk2118', 'rk312x', 'rk3126', 'rk3128', + 'rk3128h', 'rk322x', 'rk3228a', 'rk3228b', 'rk3228h', 'rk322xh', 'rk3229', 'rk3308', 'rk3288', + 'rk3326', 'rk3326s', 'rk3328', 'rk3368', 'rk3399', 'rk3506', 'rk3528', 'rk356x', 'rk3562', + 'rk3566', 'rk3568', 'rk3576', 'rk3588', 'rv1103', 'rv1103b', 'rv1106', 'rv1108', 'rv1109', + 'rv1126'] + +version_old_list = ['rk322xh', 'rk3328', 'rk3318'] + +# struct rk3528_ca_skew +rk3528_ca_skew = { + 'skew_freq': 0, + 'ca_skew_0': 0, + 'ca_skew_1': 0, + 'ca_skew_2': 0, + 'ca_skew_3': 0, + 'ca_skew_4': 0, + 'ca_skew_5': 0, + 'ca_skew_6': 0, + 'ca_skew_7': 0, +} + +# struct rk3528_skew_info +rk3528_skew_info = { + 'skew_sub_version': 0, + 'ddr3' : rk3528_ca_skew.copy(), + 'ddr4' : rk3528_ca_skew.copy(), + 'lp3' : rk3528_ca_skew.copy(), +} + +# struct index_info, u8 +index_info = { + 'offset' : 0, + 'size' : 0 +} + +# struct sdram_head_info_index_v2 +sdram_head_info_index_v2 = { + 'cpu_gen_index' : index_info.copy(), + 'global_index' : index_info.copy(), + 'ddr2_index' : index_info.copy(), + 'ddr3_index' : index_info.copy(), + 'ddr4_index' : index_info.copy(), + 'ddr5_index' : index_info.copy(), + 'lp2_index' : index_info.copy(), + 'lp3_index' : index_info.copy(), + 'lp4_index' : index_info.copy(), + 'lp5_index' : index_info.copy(), + 'skew_index' : index_info.copy(), + 'dq_map_index' : index_info.copy(), +} + +sdram_head_info_index_v2_3 = { + 'lp4x_index' : index_info.copy(), + 'lp4_4x_hash_index' : index_info.copy() +} + +sdram_head_info_index_v3_4 = { + 'lp5_hash_index' : index_info.copy(), + 'ddr4_hash_index' : index_info.copy(), + 'lp3_hash_index' : index_info.copy(), + 'ddr3_hash_index' : index_info.copy(), + 'lp2_hash_index' : index_info.copy(), + 'ddr2_hash_index' : index_info.copy(), + 'ddr5_hash_index' : index_info.copy(), +} + +# struct global_info +global_info = { + 'uart_info' : 0, + 'sr_pd_info' : 0, + 'ch_info' : 0, + 'info_2t' : 0, + 'reserved_0' : 0, + 'reserved_1' : 0, + 'reserved_2' : 0, + 'reserved_3' : 0, +} + +# struct ddr2_3_4_lp2_3_info +ddr2_3_4_lp2_3_info = { + 'ddr_freq0_1' : 0, + 'ddr_freq2_3' : 0, + 'ddr_freq4_5' : 0, + 'drv_when_odten' : 0, + 'drv_when_odtoff' : 0, + 'odt_info' : 0, + 'odten_freq' : 0, + 'sr_when_odten' : 0, + 'sr_when_odtoff' : 0, +} + +# struct ddr2_3_4_lp2_3_info_v5 +ddr2_3_4_lp2_3_info_v5 = { + 'ddr_freq0_1' : 0, + 'ddr_freq2_3' : 0, + 'ddr_freq4_5' : 0, + 'drv_when_odten' : 0, + 'drv_when_odtoff' : 0, + 'odt_info' : 0, + 'odten_freq' : 0, + 'sr_when_odten' : 0, + 'sr_when_odtoff' : 0, + 'vref_when_odten' : 0, + 'vref_when_odtoff' : 0, +} + +# struct lp4_info +lp4_info = { + 'ddr_freq0_1' : 0, + 'ddr_freq2_3' : 0, + 'ddr_freq4_5' : 0, + 'drv_when_odten' : 0, + 'drv_when_odtoff' : 0, + 'odt_info' : 0, + 'dq_odten_freq' : 0, + 'sr_when_odten' : 0, + 'sr_when_odtoff' : 0, + 'ca_odten_freq' : 0, + 'cs_drv_ca_odt_info' : 0, + 'vref_when_odten' : 0, + 'vref_when_odtoff' : 0, +} + +# struct dq_map_info +dq_map_info = { + 'byte_map_0' : 0, + 'byte_map_1' : 0, + 'lp3_dq0_7_map' : 0, + 'lp2_dq0_7_map' : 0, + 'ddr4_dq_map_0' : 0, + 'ddr4_dq_map_1' : 0, + 'ddr4_dq_map_2' : 0, + 'ddr4_dq_map_3' : 0, +} + +# struct hash_info +hash_info = { + 'ch_mask_0' : 0, + 'ch_mask_1' : 0, + 'bank_mask_0' : 0, + 'bank_mask_1' : 0, + 'bank_mask_2' : 0, + 'bank_mask_3' : 0, + 'rank_mask0' : 0, + 'rank_mask1' : 0, +} + +# struct sdram_head_info_v2 +sdram_head_info_v2 = { + 'global_info' : global_info.copy(), + 'ddr2_info' : ddr2_3_4_lp2_3_info.copy(), + 'ddr3_info' : ddr2_3_4_lp2_3_info.copy(), + 'ddr4_info' : ddr2_3_4_lp2_3_info.copy(), + 'ddr5_info' : ddr2_3_4_lp2_3_info.copy(), + 'lp2_info' : ddr2_3_4_lp2_3_info.copy(), + 'lp3_info' : ddr2_3_4_lp2_3_info.copy(), + 'lp4_info' : lp4_info.copy(), + 'dq_map_info' : dq_map_info.copy(), + 'lp4x_info' : lp4_info.copy(), + 'lp5_info' : lp4_info.copy(), + 'lp4_4x_hash_info' : hash_info.copy(), + 'lp5_hash_info' : hash_info.copy(), + 'ddr4_hash_info' : hash_info.copy(), + 'lp3_hash_info' : hash_info.copy(), + 'ddr3_hash_info' : hash_info.copy(), + 'lp2_hash_info' : hash_info.copy(), + 'ddr2_hash_info' : hash_info.copy(), + 'ddr5_hash_info' : hash_info.copy(), +} + +# struct sdram_head_info_v5 +sdram_head_info_v5 = { + 'global_info' : global_info.copy(), + 'ddr2_info' : ddr2_3_4_lp2_3_info_v5.copy(), + 'ddr3_info' : ddr2_3_4_lp2_3_info_v5.copy(), + 'ddr4_info' : ddr2_3_4_lp2_3_info_v5.copy(), + 'ddr5_info' : ddr2_3_4_lp2_3_info_v5.copy(), + 'lp2_info' : ddr2_3_4_lp2_3_info_v5.copy(), + 'lp3_info' : ddr2_3_4_lp2_3_info_v5.copy(), + 'lp4_info' : lp4_info.copy(), + 'dq_map_info' : dq_map_info.copy(), + 'lp4x_info' : lp4_info.copy(), + 'lp5_info' : lp4_info.copy(), + 'lp4_4x_hash_info' : hash_info.copy(), + 'lp5_hash_info' : hash_info.copy(), + 'ddr4_hash_info' : hash_info.copy(), + 'lp3_hash_info' : hash_info.copy(), + 'ddr3_hash_info' : hash_info.copy(), + 'lp2_hash_info' : hash_info.copy(), + 'ddr2_hash_info' : hash_info.copy(), + 'ddr5_hash_info' : hash_info.copy(), +} + +sdram_head_info_v0 = [[0xc, 0], [0x10, 0], [0x14, 0], [0x18, 0], [0x1c, 0], [0x20, 0], [0x24, 0]] + +# struct base_info_full +base_info_full = { + 'start tag': {'value': 0, 'num_base': 'hex', 'index': 'null', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 0, 'v0_info': [0x0, 0, 0xffffffff]}, + + 'ddr2_freq': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 0, 'v0_info': [0xc, 16, 0xffff]}, + 'lp2_freq': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 0, 'v0_info': [0xc, 0, 0xffff]}, + 'ddr3_freq': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 0, 'v0_info': [0x10, 16, 0xffff]}, + 'lp3_freq': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 0, 'v0_info': [0x10, 0, 0xffff]}, + 'ddr4_freq': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 0, 'v0_info': [0x14, 16, 0xffff]}, + 'lp4_freq': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 0, 'v0_info': [0x14, 0, 0xffff]}, + 'lp4x_freq': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp5_freq': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq0_1', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'uart id': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'uart_info', 'shift': 28, 'mask': 0xf, 'version': 0, 'v0_info': [0x18, 28, 0xf]}, + 'uart iomux': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'uart_info', 'shift': 24, 'mask': 0xf, 'version': 0, 'v0_info': [0x18, 24, 0xf]}, + 'uart baudrate': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'uart_info', 'shift': 0, 'mask': 0xffffff, 'version': 0, 'v0_info': [0x18, 0, 0xffffff]}, + 'sr_idle': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'sr_pd_info', 'shift': 16, 'mask': 0xffff, 'version': 0, 'v0_info': [0x1c, 16, 0xffff]}, + 'pd_idle': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'sr_pd_info', 'shift': 0, 'mask': 0xffff, 'version': 0, 'v0_info': [0x1c, 0, 0xffff]}, + 'first scan channel': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'ch_info', 'shift': 28, 'mask': 0xf, 'version': 0, 'v0_info': [0x20, 28, 0xf]}, + 'channel mask': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'ch_info', 'shift': 24, 'mask': 0xf, 'version': 0, 'v0_info': [0x20, 24, 0xf]}, + 'stride type': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'ch_info', 'shift': 16, 'mask': 0xff, 'version': 0, 'v0_info': [0x20, 16, 0xff]}, + 'standby_idle': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'ch_info', 'shift': 0, 'mask': 0xffff, 'version': 0, 'v0_info': [0x20, 0, 0xffff]}, + 'ext_temp_ref': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 29, 'mask': 0x3, 'version': 0, 'v0_info': [0x24, 29, 0x3]}, + 'link_ecc_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 28, 'mask': 0x1, 'version': 2}, + 'per_bank_ref_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 27, 'mask': 0x1, 'version': 2}, + 'derate_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 26, 'mask': 0x1, 'version': 0, 'v0_info': [0x24, 26, 0x1]}, + 'auto_precharge_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 25, 'mask': 0x1, 'version': 2}, + 'res_space_remap_all': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 24, 'mask': 0x1, 'version': 2}, + 'res_space_remap_portion': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 20, 'mask': 0x1, 'version': 2}, + 'rd_vref_scan_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 21, 'mask': 0x1, 'version': 2}, + 'wr_vref_scan_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 22, 'mask': 0x1, 'version': 2}, + 'eye_2d_scan_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 23, 'mask': 0x1, 'version': 2}, + 'dis_train_print': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 19, 'mask': 0x1, 'version': 2}, + 'ssmod_downspread': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 17, 'mask': 0x3, 'version': 0, 'v0_info': [0x24, 17, 0x3]}, + 'ssmod_div': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 9, 'mask': 0xff, 'version': 0, 'v0_info': [0x24, 9, 0xff]}, + 'ssmod_spread': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 1, 'mask': 0xff, 'version': 0, 'v0_info': [0x24, 1, 0xff]}, + 'ddr_2t': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 0, 'mask': 0x1, 'version': 0, 'v0_info': [0x24, 0, 0x1]}, + 'reserved_global_info_2t_bit31': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'info_2t', 'shift': 31, 'mask': 0x1, 'version': 2}, + 'pstore_base_addr': {'value': 0, 'num_base': 'hex', 'index': 'global_index', 'position': 'reserved_0', 'shift': 16, 'mask': 0xffff, 'version': 2}, + 'pstore_buf_size': {'value': 0, 'num_base': 'hex', 'index': 'global_index', 'position': 'reserved_0', 'shift': 12, 'mask': 0xf, 'version': 2}, + 'uboot_log_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_0', 'shift': 4, 'mask': 0x1, 'version': 2}, + 'atf_log_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_0', 'shift': 3, 'mask': 0x1, 'version': 2}, + 'optee_log_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_0', 'shift': 2, 'mask': 0x1, 'version': 2}, + 'spl_log_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_0', 'shift': 1, 'mask': 0x1, 'version': 2}, + 'tpl_log_en': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_0', 'shift': 0, 'mask': 0x1, 'version': 2}, + 'reserved_global_reserved_0_bit5_11': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_0', 'shift': 5, 'mask': 0x7f, 'version': 2}, + 'first_init_dram_type': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_1', 'shift': 5, 'mask': 0xf, 'version': 2}, + 'dfs_disable': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_1', 'shift': 4, 'mask': 0x1, 'version': 2}, + 'pageclose': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_1', 'shift': 3, 'mask': 0x1, 'version': 2}, + 'boot_fsp': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_1', 'shift': 0, 'mask': 0x7, 'version': 2}, + 'reserved_global_reserved_1_bit9_31': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_1', 'shift': 9, 'mask': 0x7fffff, 'version': 2}, + 'reserved_global_reserved_2_bit0_31': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_2', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + 'reserved_global_reserved_3_bit0_31': {'value': 0, 'num_base': 'dec', 'index': 'global_index', 'position': 'reserved_3', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + + 'ddr2_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr2_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr2_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'ddr2_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr2_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr2_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'ddr2_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr2_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr2_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr2_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'ddr2_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_odt_pull_up_en': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'phy_ddr2_odt_pull_dn_en': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odt_info', 'shift': 19, 'mask': 0x1, 'version': 2}, + 'reserved_ddr2_odt_info_bit20_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odt_info', 'shift': 20, 'mask': 0xfff, 'version': 2}, + 'phy_ddr2_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'ddr2_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr2_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_ddr2_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_ddr2_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr2_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'ddr2_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'ddr2_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_ddr2_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 5}, + 'phy_ddr2_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'ddr2_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'ddr2_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_ddr2_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr2_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 5}, + + 'ddr3_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr3_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr3_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'ddr3_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr3_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr3_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'ddr3_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr3_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr3_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr3_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'ddr3_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_odt_pull_up_en': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'phy_ddr3_odt_pull_dn_en': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odt_info', 'shift': 19, 'mask': 0x1, 'version': 2}, + 'reserved_ddr3_odt_info_bit20_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odt_info', 'shift': 20, 'mask': 0xfff, 'version': 2}, + 'phy_ddr3_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'ddr3_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr3_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_ddr3_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_ddr3_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr3_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'ddr3_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'ddr3_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_ddr3_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 5}, + 'phy_ddr3_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'ddr3_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'ddr3_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_ddr3_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr3_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 5}, + + 'ddr4_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr4_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr4_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'ddr4_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr4_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr4_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'ddr4_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr4_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr4_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr4_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'ddr4_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_odt_pull_up_en': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'phy_ddr4_odt_pull_dn_en': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odt_info', 'shift': 19, 'mask': 0x1, 'version': 2}, + 'reserved_ddr4_odt_info_bit20_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odt_info', 'shift': 20, 'mask': 0xfff, 'version': 2}, + 'phy_ddr4_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'ddr4_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_ddr4_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_ddr4_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_ddr4_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_ddr4_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'ddr4_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'ddr4_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_ddr4_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 5}, + 'phy_ddr4_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'ddr4_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'ddr4_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_ddr4_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'ddr4_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 5}, + + 'lp2_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp2_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp2_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp2_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp2_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp2_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp2_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp2_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp2_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp2_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp2_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp2_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp2_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp2_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp2_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp2_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp2_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'lp2_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp2_odt_pull_up_en': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'phy_lp2_odt_pull_dn_en': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odt_info', 'shift': 19, 'mask': 0x1, 'version': 2}, + 'reserved_lp2_odt_info_bit20_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odt_info', 'shift': 20, 'mask': 0xfff, 'version': 2}, + 'phy_lp2_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'lp2_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp2_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp2_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp2_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp2_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp2_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp2_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp2_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp2_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp2_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp2_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'lp2_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'lp2_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_lp2_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 5}, + 'phy_lp2_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'lp2_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'lp2_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_lp2_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp2_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 5}, + + 'lp3_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp3_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp3_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp3_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp3_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp3_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp3_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp3_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp3_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp3_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp3_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp3_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp3_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp3_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp3_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp3_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp3_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'lp3_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp3_odt_pull_up_en': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'phy_lp3_odt_pull_dn_en': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odt_info', 'shift': 19, 'mask': 0x1, 'version': 2}, + 'reserved_lp3_odt_info_bit20_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odt_info', 'shift': 20, 'mask': 0xfff, 'version': 2}, + 'phy_lp3_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'lp3_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp3_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp3_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp3_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp3_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp3_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp3_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp3_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp3_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp3_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp3_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'lp3_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'lp3_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_lp3_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 5}, + 'phy_lp3_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 5}, + 'lp3_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 5}, + 'lp3_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 5}, + 'reserved_lp3_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp3_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 5}, + + 'lp4_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp4_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp4_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp4_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp4_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp4_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp4_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'lp4_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'lp4_ca_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 18, 'mask': 0xff, 'version': 2}, + 'lp4_drv_pu_cal_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 26, 'mask': 0x1, 'version': 2}, + 'lp4_drv_pu_cal_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 27, 'mask': 0x1, 'version': 2}, + 'phy_lp4_drv_pull_dn_en_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 28, 'mask': 0x1, 'version': 2}, + 'phy_lp4_drv_pull_dn_en_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 29, 'mask': 0x1, 'version': 2}, + 'reserved_lp4_odt_info_bit31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'odt_info', 'shift': 31, 'mask': 0x1, 'version': 2}, + 'phy_lp4_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'dq_odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'lp4_dq_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'dq_odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4_dq_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'dq_odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp4_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp4_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp4_ca_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ca_odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4_ca_odten_freq_bit12_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'ca_odten_freq', 'shift': 12, 'mask': 0xfffff, 'version': 2}, + 'phy_lp4_cs_drv_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'cs_drv_ca_odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4_cs_drv_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'cs_drv_ca_odt_info', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'lp4_odte_ck': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'cs_drv_ca_odt_info', 'shift': 16, 'mask': 0x1, 'version': 2}, + 'lp4_odte_cs_en': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'cs_drv_ca_odt_info', 'shift': 17, 'mask': 0x1, 'version': 2}, + 'lp4_odtd_ca_en': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'cs_drv_ca_odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'reserved_lp4cs_drv_ca_odt_info_bit19_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'cs_drv_ca_odt_info', 'shift': 19, 'mask': 0x1fff, 'version': 2}, + 'phy_lp4_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 2}, + 'lp4_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 2}, + 'lp4_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 2}, + 'reserved_lp4_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 2}, + 'phy_lp4_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 2}, + 'lp4_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 2}, + 'lp4_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 2}, + 'reserved_lp4_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 2}, + + 'ddr2_bytes_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_0', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'ddr3_bytes_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_0', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'ddr4_bytes_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_0', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'reservedbyte_map_0_bit8_15': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_0', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'lp2_bytes_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_1', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'lp3_bytes_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_1', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp4_bytes_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'reserved_byte_map_1_bit0_7': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'byte_map_1', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'lp3_dq0_7_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'lp3_dq0_7_map', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + 'lp2_dq0_7_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'lp2_dq0_7_map', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + 'ddr4_cs0_dq0_dq15_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'ddr4_dq_map_0', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + 'ddr4_cs0_dq16_dq31_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'ddr4_dq_map_1', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + 'ddr4_cs1_dq0_dq15_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'ddr4_dq_map_2', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + 'ddr4_cs1_dq16_dq31_map': {'value': 0, 'num_base': 'hex', 'index': 'dq_map_index', 'position': 'ddr4_dq_map_3', 'shift': 0, 'mask': 0xffffffff, 'version': 2}, + + 'lp4x_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4x_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp4x_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp4x_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4x_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp4x_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp4x_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4x_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp4x_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp4x_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'lp4x_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'lp4x_ca_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 18, 'mask': 0xff, 'version': 2}, + 'lp4x_drv_pu_cal_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 26, 'mask': 0x1, 'version': 2}, + 'lp4x_drv_pu_cal_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 27, 'mask': 0x1, 'version': 2}, + 'phy_lp4x_drv_pull_dn_en_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 28, 'mask': 0x1, 'version': 2}, + 'phy_lp4x_drv_pull_dn_en_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 29, 'mask': 0x1, 'version': 2}, + 'reserved_lp4x_odt_info_bit31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'odt_info', 'shift': 31, 'mask': 0x1, 'version': 2}, + 'phy_lp4x_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'dq_odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'lp4x_dq_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'dq_odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4x_dq_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'dq_odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp4x_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp4x_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp4x_ca_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ca_odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp4x_ca_odten_freq_bit12_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'ca_odten_freq', 'shift': 12, 'mask': 0xfffff, 'version': 2}, + 'phy_lp4x_cs_drv_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'cs_drv_ca_odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp4x_cs_drv_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'cs_drv_ca_odt_info', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'lp4x_odte_ck': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'cs_drv_ca_odt_info', 'shift': 16, 'mask': 0x1, 'version': 2}, + 'lp4x_odte_cs_en': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'cs_drv_ca_odt_info', 'shift': 17, 'mask': 0x1, 'version': 2}, + 'lp4x_odtd_ca_en': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'cs_drv_ca_odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'reserved_lp4xcs_drv_ca_odt_info_bit19_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'cs_drv_ca_odt_info', 'shift': 19, 'mask': 0x1fff, 'version': 2}, + 'phy_lp4x_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 2}, + 'lp4x_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 2}, + 'lp4x_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 2}, + 'reserved_lp4x_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 2}, + 'phy_lp4x_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 2}, + 'lp4x_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 2}, + 'lp4x_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 2}, + 'reserved_lp4x_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp4x_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 2}, + + 'lp5_f1_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq0_1', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp5_ddr_freq0_1_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq0_1', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp5_f2_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq2_3', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp5_f3_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq2_3', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp5_ddr_freq2_3_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq2_3', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp5_f4_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq4_5', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp5_f5_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq4_5', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'reserved_lp5_ddr_freq4_5_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ddr_freq4_5', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp5_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp5_ca_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp5_clk_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp5_dq_drv_when_odten_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp5_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp5_ca_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp5_clk_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'lp5_dq_drv_when_odtoff_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'drv_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp5_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 8, 'mask': 0x3ff, 'version': 2}, + 'lp5_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'lp5_ca_odt_ohm': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 18, 'mask': 0xff, 'version': 2}, + 'lp5_drv_pu_cal_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 26, 'mask': 0x1, 'version': 2}, + 'lp5_drv_pu_cal_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 27, 'mask': 0x1, 'version': 2}, + 'phy_lp5_drv_pull_dn_en_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 28, 'mask': 0x1, 'version': 2}, + 'phy_lp5_drv_pull_dn_en_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 29, 'mask': 0x1, 'version': 2}, + 'reserved_lp5_odt_info_bit31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'odt_info', 'shift': 31, 'mask': 0x1, 'version': 2}, + 'phy_lp5_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'dq_odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'lp5_dq_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'dq_odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'reserved_lp5_dq_odten_freq_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'dq_odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp5_dq_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odten', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp5_ca_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odten', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp5_clk_sr_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odten', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp5_sr_when_odten_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odten', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp5_dq_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odtoff', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp5_ca_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odtoff', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'phy_lp5_clk_sr_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odtoff', 'shift': 16, 'mask': 0xff, 'version': 2}, + 'reserved_lp5_sr_when_odtoff_bit24_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'sr_when_odtoff', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'lp5_ca_odten_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ca_odten_freq', 'shift': 0, 'mask': 0xfff, 'version': 2}, + 'lp5_wck_odt_en_freq': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ca_odten_freq', 'shift': 12, 'mask': 0xfff, 'version': 2}, + 'lp5_wck_odt': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'ca_odten_freq', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'phy_lp5_cs_drv_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 0, 'mask': 0xff, 'version': 2}, + 'phy_lp5_cs_drv_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 8, 'mask': 0xff, 'version': 2}, + 'lp5_odte_ck': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 16, 'mask': 0x1, 'version': 2}, + 'lp5_odte_cs_en': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 17, 'mask': 0x1, 'version': 2}, + 'lp5_odtd_ca_en': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 18, 'mask': 0x1, 'version': 2}, + 'lp5_nt_odt': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 24, 'mask': 0xff, 'version': 2}, + 'reserved_lp5_cs_drv_ca_odt_info_bit19_23': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'cs_drv_ca_odt_info', 'shift': 19, 'mask': 0x1f, 'version': 2}, + 'phy_lp5_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odten', 'shift': 0, 'mask': 0x3ff, 'version': 2}, + 'lp5_dq_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odten', 'shift': 10, 'mask': 0x3ff, 'version': 2}, + 'lp5_ca_vref_when_odten': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odten', 'shift': 20, 'mask': 0x3ff, 'version': 2}, + 'reserved_lp5_vref_when_odten_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odten', 'shift': 30, 'mask': 0x3, 'version': 2}, + 'phy_lp5_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odtoff', 'shift': 0, 'mask': 0x3ff, 'version': 2}, + 'lp5_dq_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odtoff', 'shift': 10, 'mask': 0x3ff, 'version': 2}, + 'lp5_ca_vref_when_odtoff': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odtoff', 'shift': 20, 'mask': 0x3ff, 'version': 2}, + 'reserved_lp5_vref_when_odtoff_bit30_31': {'value': 0, 'num_base': 'dec', 'index': 'lp5_index', 'position': 'vref_when_odtoff', 'shift': 30, 'mask': 0x3, 'version': 2}, + + 'lp4_4x_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + 'lp4_4x_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp4_4x_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 3}, + + 'lp5_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp5_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp5_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'ddr4_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr4_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr4_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'lp3_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp3_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp3_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'ddr3_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr3_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr3_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'lp2_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'lp2_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'lp2_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'ddr2_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr2_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr2_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'ddr5_ch_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'ch_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_ch_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'ch_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_bank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'bank_mask_0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_bank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'bank_mask_1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_bank_mask2': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'bank_mask_2', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_bank_mask3': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'bank_mask_3', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_rank_mask0': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'rank_mask0', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + 'ddr5_rank_mask1': {'value': 0, 'num_base': 'hex', 'index': 'ddr5_hash_index', 'position': 'rank_mask1', 'shift': 0, 'mask': 0xffffffff, 'version': 4}, + + 'reserved_skew_ddr3_skew_freq_bit12_31': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_skew_freq', 'shift': 12, 'mask': 0xfffff, 'version': 4}, + 'ddr3_skew_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'skew_index', 'position': 'ddr3_skew_freq', 'shift': 0, 'mask': 0xfff, 'version': 4}, + 'ddr3_ca0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_2', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_ca1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_0', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_ca2_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_1', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ca3_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_1', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_ca4_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_1', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_ca5_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_2', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ca6_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_1', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_ca7_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_2', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_ca8_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_3', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_ca9_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_0', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ca10_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_3', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ca11_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_2', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_ca12_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_4', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_ca13_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_0', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_ca14_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_0', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_ca15_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_5', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_ras_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_5', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_cas_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_7', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ba0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_5', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ba1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_3', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_ba2_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_4', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_we_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_6', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_cke0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_4', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_cke1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_5', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_ckn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_6', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr3_ckp_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_6', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_odt0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_3', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr3_odt1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_6', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_cs0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_7', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr3_cs1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_7', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr3_resetn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr3_ca_skew_7', 'shift': 8, 'mask': 0xff, 'version': 4}, + + 'reserved_skew_ddr4_skew_freq_bit12_31': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_skew_freq', 'shift': 12, 'mask': 0xfffff, 'version': 4}, + 'ddr4_skew_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'skew_index', 'position': 'ddr4_skew_freq', 'shift': 0, 'mask': 0xfff, 'version': 4}, + 'ddr4_ca0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_0', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_ca1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_0', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_ca2_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_0', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_ca3_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_0', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_ca4_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_1', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_ca5_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_1', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_ca6_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_1', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_ca7_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_1', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_ca8_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_2', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_ca9_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_2', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_ca10_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_2', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_ca11_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_2', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_ca12_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_3', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_ca13_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_3', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_ca14_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_3', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_ca15_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_3', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_ca16_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_4', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_ca17_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_4', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_ba0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_4', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_ba1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_4', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_bg0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_5', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_bg1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_5', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_cke0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_5', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_cke1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_5', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_ckn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_6', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_ckp_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_6', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_odt0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_6', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_odt1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_6', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'ddr4_cs0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_7', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'ddr4_cs1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_7', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'ddr4_resetn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_7', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'ddr4_actn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'ddr4_ca_skew_7', 'shift': 0, 'mask': 0xff, 'version': 4}, + + 'reserved_skew_lp3_skew_freq_bit12_31': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_skew_freq', 'shift': 12, 'mask': 0xfffff, 'version': 4}, + 'lp3_skew_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'skew_index', 'position': 'lp3_skew_freq', 'shift': 0, 'mask': 0xfff, 'version': 4}, + 'lp3_ca0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_3', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'lp3_ca1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_4', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'lp3_ca2_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_2', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'lp3_ca3_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_3', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'lp3_ca4_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_3', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_ca5_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_1', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_ca6_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_2', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_ca7_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_2', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'lp3_ca8_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_5', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_ca9_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_7', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'lp3_cke0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_4', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'lp3_cke1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_5', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'lp3_ckn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_6', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_ckp_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_6', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'lp3_odt0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_6', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'lp3_odt1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_6', 'shift': 0, 'mask': 0xff, 'version': 4}, + 'lp3_odt2_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_0', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_odt3_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_0', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'lp3_cs0_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_7', 'shift': 16, 'mask': 0xff, 'version': 4}, + 'lp3_cs1_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_7', 'shift': 24, 'mask': 0xff, 'version': 4}, + 'lp3_cs2_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_1', 'shift': 8, 'mask': 0xff, 'version': 4}, + 'lp3_cs3_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'lp3_ca_skew_3', 'shift': 8, 'mask': 0xff, 'version': 4}, + + 'reserved_skew_lp4_skew_freq_bit12_31': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_skew_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca0_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca1_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca2_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca3_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca4_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca5_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_odt0_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_odt1_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cke0_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cke1_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ckn_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ckp_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cs0_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cs1_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca0_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca1_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca2_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca3_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca4_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ca5_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_odt0_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_odt1_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cke0_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cke1_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ckn_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_ckp_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cs0_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_cs1_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp4_resetn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + + 'reserved_skew_lp5_skew_freq_bit12_31': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_skew_freq_mhz': {'value': 0, 'num_base': 'dec', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca0_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca1_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca2_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca3_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca4_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca5_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca6_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ckn_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ckp_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_cs0_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_cs1_a_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca0_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca1_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca2_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca3_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca4_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca5_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ca6_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ckn_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_ckp_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_cs0_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_cs1_b_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, + 'lp5_resetn_skew': {'value': 0, 'num_base': 'hex', 'index': 'skew_index', 'position': 'null', 'shift': 0, 'mask': 0, 'version': 4}, +} + + +def bin_data_2_info(info_from_bin, read_out, ddrbin_index, version, info_from_txt): + info_from_bin['start tag']['value'] = 0x12345678 + + if version < 2: + for key, value in info_from_bin.items(): + if value['version'] <= version: + for i in range(len(read_out)): + # read_out is sdram_head_info_v0 = [[offset, value], ...] + # info_from_bin v0_info = [offset, shift, mask] + if value['v0_info'][0] == read_out[i][0]: + temp_value = (read_out[i][1] >> value['v0_info'][1]) & value['v0_info'][2] + info_from_bin[key]['value'] = temp_value + #print(f"D: {key} = {value} {hex(value['v0_info'][0])}={read_out[i][1]}") + elif version <= version_max: + for index_name in ddrbin_index: + head_info_name = index_name[:-6]+'_info' + if ddrbin_index[index_name]['offset'] != 0 and 'skew' not in index_name: + for key, value in info_from_bin.items(): + if value['index'] == index_name and value['version'] <= version: + temp_value = read_out[head_info_name][value['position']] + temp_value = (temp_value >> value['shift']) & value['mask'] + info_from_bin[key]['value'] = temp_value + #print(f"D: {key} = {value} {value['position']}={temp_value}") + elif ddrbin_index[index_name]['offset'] != 0 and 'skew' in index_name: + if chip_info == 'rk3528': + for key, value in info_from_bin.items(): + if value['index'] == index_name and value['version'] <= version: + position_1 = value['position'][ : value['position'].find('_')] + position_2 = value['position'][value['position'].find('_') + 1 : ] + # read_out is sdram_head_info_v2 or sdram_head_info_v5 + if position_1 in list(read_out[head_info_name].keys()): + temp_value = read_out[head_info_name][position_1][position_2] + temp_value = (temp_value >> value['shift']) & value['mask'] + info_from_bin[key]['value'] = temp_value + #print(f"D: {key} = {value} {value['position']}={temp_value}") + + return 0 + + +def modefy_2_bin_data(info_from_txt, write_in, ddrbin_index, version): + global rk3528_skew_info + + if version < 2: + for key, value in info_from_txt.items(): + if value['version'] <= version: + for i in range(len(write_in)): + if value['v0_info'][0] == write_in[i][0]: + write_in[i][1] |= (value['value'] << value['v0_info'][1]) + elif version <= version_max: + for index_name in ddrbin_index: + head_info_name = index_name[:-6]+'_info' + if ddrbin_index[index_name]['offset'] != 0 and 'skew' not in index_name: + position_name = 'null' + for key, value in info_from_txt.items(): + if value['index'] == index_name and value['version'] <= version: + if position_name != value['position']: + position_name = value['position'] + position_value = 0 + position_value |= (value['value'] << value['shift']) + write_in[head_info_name][value['position']] = position_value + #print(f"D: {key} = {value}, {value['position']}={position_value}") + elif ddrbin_index[index_name]['offset'] != 0 and 'skew' in index_name: + if chip_info == 'rk3528': + write_in.update({'skew_info' : rk3528_skew_info}) + if rk3528_skew_info['skew_sub_version'] == 0x1: + for key, value in info_from_txt.items(): + if value['index'] == index_name and value['version'] <= version: + position_1 = value['position'][ : value['position'].find('_')] + position_2 = value['position'][value['position'].find('_') + 1 : ] + if position_1 in list(write_in[head_info_name].keys()): + temp_value = write_in[head_info_name][position_1][position_2] + temp_value &= ~(value['mask'] << value['shift']) + temp_value |= value['value'] << value['shift'] + write_in[head_info_name][position_1][position_2] = temp_value + #print(f"D: {key} = {value}, {temp_value}") + + #print(f"D: write_in = {write_in}") + return 0 + + +def write_in_bin_data_v2(filebin, bin_skew_offset, write_in, ddrbin_index, info_from_txt, version): + for index_name in ddrbin_index: + head_info_name = index_name[:-6]+'_info' + if ddrbin_index[index_name]['offset'] != 0 and 'skew' not in index_name: + filebin.seek(bin_skew_offset + (ddrbin_index[index_name]['offset'] - 1) * 4) + index_size = ddrbin_index[index_name]['size'] + for key in write_in[head_info_name]: + if index_size > 0: + try: + filebin.write(write_in[head_info_name][key].to_bytes(4,byteorder='little')) + #print(f"D: {head_info_name} {key} = {write_in[head_info_name][key]}") + index_size -= 1 + except: + print("write bin {} to file fail".format(head_info_name)) + return -1 + elif ddrbin_index[index_name]['offset'] != 0 and 'skew' in index_name: + if chip_info == 'rk3528' and write_in[head_info_name]["skew_sub_version"] == 1: + filebin.seek(bin_skew_offset + (ddrbin_index[index_name]['offset'] - 1) * 4) + index_size = ddrbin_index[index_name]['size'] + for key in write_in[head_info_name]: + if key == 'skew_sub_version': + temp_value = write_in[head_info_name]["skew_sub_version"] + filebin.write(temp_value.to_bytes(4,byteorder='little')) + continue + for key_1 in write_in[head_info_name][key]: + if index_size > 0: + try: + temp_value = write_in[head_info_name][key][key_1] + #print(f"D: {head_info_name} {key}.{key_1} = {temp_value}") + filebin.write(temp_value.to_bytes(4,byteorder='little')) + index_size -= 1 + except: + print("write bin {} to file fail".format(head_info_name)) + return -1 + + return 0 + + +#info from bin + info from txt generate to loader parameters +def txt_data_2_bin_data(info_from_txt, info_from_bin, ddrbin_index, write_in, version): + print("\nnew bin config:") + + for key, value in info_from_txt.items(): + if key == 'start tag': + continue + if (info_from_txt[key]['value'] == 0) and (key not in update_key_list): + info_from_txt[key]['value'] = info_from_bin[key]['value'] + else: + if info_from_txt[key]['num_base'] == 'hex': + print("{}: {}".format(key, hex(info_from_txt[key]['value']))) + else: + print("{}: {}".format(key, info_from_txt[key]['value'])) + #print(info_from_txt) + + modefy_2_bin_data(info_from_txt, write_in, ddrbin_index, version) + + return 0 + + +def bin_data_readout(filebin, ddrbin_index, read_out, bin_skew_offset, version, info_from_txt): + global rk3528_skew_info + + if version < 2: + for i in range(len(read_out)): + try: + read_out[i][1] = int.from_bytes(filebin.read(4), byteorder='little') + #print(f"D: read_out {hex(read_out[i][0])} = {read_out[i][1]}") + except: + print("read bin file fail") + return -1 + elif version <= version_max: + for index_name in ddrbin_index: + head_info_name = index_name[:-6]+'_info' + if ddrbin_index[index_name]['offset'] != 0 and 'skew' not in index_name: + filebin.seek(bin_skew_offset + (ddrbin_index[index_name]['offset'] - 1) * 4) + index_size = ddrbin_index[index_name]['size'] + for key in read_out[head_info_name]: + if index_size > 0: + try: + temp_value = int.from_bytes(filebin.read(4), byteorder='little') + read_out[head_info_name][key] = temp_value + #print(f"D: {head_info_name} {key} = {read_out[head_info_name][key]}") + index_size -= 1 + except: + print("read {} from bin file fail".format(head_info_name)) + return -1 + elif ddrbin_index[index_name]['offset'] != 0 and 'skew' in index_name: + try: + filebin.seek(bin_skew_offset + (ddrbin_index[index_name]['offset'] - 1) * 4) + skew_sub_ver = int.from_bytes(filebin.read(4), byteorder='little') & 0xff + except: + print("read skew_sub_ver from bin file fail") + return -1 + if chip_info == 'rk3528' and skew_sub_ver == 0x1: + for i in rk3528_skew_info: + if i == 'skew_sub_version': + rk3528_skew_info[i] = skew_sub_ver + continue + for j in rk3528_skew_info[i]: + try: + temp_value = int.from_bytes(filebin.read(4), byteorder='little') + rk3528_skew_info[i][j] = temp_value + #print(f"D: {i}.{j}={rk3528_skew_info[i][j]}") + except: + print("read {} from bin file fail".format(head_info_name)) + return -1 + + read_out.update({'skew_info' : rk3528_skew_info}) + + return 0 + + +def gen_info_from_bin(filegen_path, info_from_bin, verinfo_full, version): + with open(filegen_path, 'w+', encoding='utf-8') as file: + file.write('/* ' + verinfo_full + ' */\n') + + with open(filegen_path, 'a', encoding='utf-8') as file: + for key, value in info_from_bin.items(): + if "reserved" in key: + continue + + if value['num_base'] == 'hex': + value_str = str(hex(value['value'])) + else: + value_str = str(value['value']) + + write_buff = key + '=' + value_str + #print(f"D: {write_buff}") + file.write(write_buff + '\n') + + with open(filegen_path, 'a', encoding='utf-8') as file: + file.write('end' + '\n') + + return 0 + + +def print_help(): + print( + "For more details, please refer to the ddrbin_tool_user_guide.txt\n"\ + "This tools support two functions\n"\ + "for example:\n"\ + "function 1: modify ddr.bin file from ddrbin_param.txt.\n"\ + " 1) modify 'ddrbin_param.txt', set ddr frequency, uart info etc what you want.\n"\ + " If want to keep items default, please keep these items blank.\n"\ + " The date & time in the version information will be updated by default.\n"\ + " like: ./ddrbin_tool px30 ddrbin_param.txt px30_ddr_333MHz_v1.13.bin\n"\ + "\n"\ + " OPTION: --verinfo_editable=TEXT The TEXT(max 17 chars) will replace\n"\ + " the date & time in the version information.\n"\ + " like: ./ddrbin_tool px30 ddrbin_param.txt px30_ddr_333MHz_v1.13.bin [OPTION]\n"\ + "\n"\ + "function 2: get ddr.bin file config to gen_param.txt file\n"\ + " If want to get ddrbin file config, please run like that:\n"\ + " ./ddrbin_tool px30 -g gen_param.txt px30_ddr_333MHz_v1.15.bin\n"\ + " The config will show in gen_param.txt.\n"\ + "\n"\ + "Note: The function 1 and function 2 are two separate functions\n"\ + "The gen_param.txt file which is generated by function 2 is no need used in function 1.\n"\ + "\n"\ + "For more details, please refer to the ddrbin_tool_user_guide.txt\n"\ + ) + + +def ddrbin_tool(argc, argv): + global updata_key_list + global chip_info + + info_from_txt = copy.deepcopy(base_info_full) + info_from_bin = copy.deepcopy(base_info_full) + ddrbin_index = copy.deepcopy(sdram_head_info_index_v2) + + version_old_hit = 0 + gen_txt_from_bin = 0 + + verinfo_full = '' + verinfo_full_offset = 0 + verinfo_full_length = 0 + verinfo_editable = '' + verinfo_editable_offset = 0 + verinfo_editable_length = 17 + + print("version v1.21 20241211") + print("python {}, {}, {}".format(sys.version.split(' ', 1)[0], platform.system(), platform.machine())) + if sys.version_info < (3, 6): + print("Warning: Please installed Python 3.6 or later.") + + if argc == 1: + print_help() + return -1 + + chip_info = argv[1] + if chip_info not in chip_list: + chip_info = 'others chip' + print("chip: {}".format(chip_info)) + + try: + opts, args = getopt.gnu_getopt(argv, 'g:h', ['verinfo_editable=']) + except: + print_help() + return -1 + + for opt, arg in opts: + if opt == '-g': + gen_txt_from_bin = 1 + filegen_path = arg + elif opt == '--verinfo_editable': + verinfo_editable = arg + if len(verinfo_editable) > verinfo_editable_length: + print("The character count of 'verinfo_editable' exceeds the allowed limit of 17.") + return -1 + elif opt == '-h': + print_help() + return -1 + + if gen_txt_from_bin == 1: + # function: get ddr.bin file config to gen_param.txt file + if argc < 5: + print("The number of parameters error") + print_help() + return -1 + + filebin_path = argv[4] + if os.path.exists(filebin_path) != True: + print("The file {} not exist".format(filebin_path)) + return -1 + + #print(f"D: filegen_path={filegen_path}, {filebin_path}") + else: + # function: modify ddr.bin file from ddrbin_param.txt. + if argc < 4: + print("The number of parameters error") + print_help() + return -1 + + fileskew_path = argv[2] + if os.path.exists(fileskew_path) != True: + print("The file {} not exist".format(fileskew_path)) + return -1 + + filebin_path = argv[3] + if os.path.exists(filebin_path) != True: + print("The file {} not exist".format(filebin_path)) + return -1 + + for key in version_old_list: + if key in argv[3]: + version_old_hit = 1 + #print(f"D: fileskew_path={fileskew_path},{filebin_path},version_old_hit={version_old_hit}") + + if gen_txt_from_bin != 1: + # Read the parameters that need to be modified from the txt file. + key_list = list(info_from_txt.keys()) + hot = 0 + try: + with open(fileskew_path,'r', encoding='UTF-8') as file: + for line in file: + if '/*' in line: + continue + + if '=' in line: + index_of_line = line.find('=') + if line[index_of_line : ].strip() != '=': + info_dict_key = line[ : index_of_line] + info_dict_value = line[index_of_line + 1 : -1] + + if '0x' in info_dict_value: + info_dict_value = int(info_dict_value[2:], 16) + else: + info_dict_value = int(info_dict_value) + + info_from_txt[info_dict_key]['value'] = info_dict_value + + # append info_dict_key to update_key_list, need updata value from txt + update_key_list.append(info_dict_key) + #print(f"D: update_key_list append, {info_dict_key}={info_dict_value}") + + hot = hot + 1 + except (KeyError, ValueError): + print("KeyError or ValueError: {}={}".format(info_dict_key, info_dict_value)) + return -1 + except Exception: + print("The file {} read failed".format(fileskew_path)) + return -1 + + if hot == 0: + print("Failed to read DRAM parameters from the file") + return -1 + else: + info_from_txt['start tag']['value'] = 0x12345678 + + # get info from bin file + with open(filebin_path, 'rb') as file: + content = file.read() + # convert the target byte sequence 'start tag' into bytes, byteorder little + target_bytes = struct.pack('= 0 and version <= version_max: + break + else: + start_position = position + len(target_bytes) + + if position == -1: + if start_position == 0: + print("Find the 'start tag' in the ddrbin file failed") + else: + print("version = {}, invalid.".format(version)) + if version > version_max and version < (version_max + 5): + print("Please check if there is a new version of the tool available.") + return -1 + + # get ddrbin parameters version + try: + bin_skew_offset = position + 4 + filebin = open(filebin_path, 'rb+') + filebin.seek(bin_skew_offset) + version = int.from_bytes(filebin.read(4), byteorder='little') + except: + print("get version fail") + filebin.close() + return -1 + + print("version {}".format(version)) + + # get ddrbin version information from bin file + # eg: DDR 03ea844c5d typ 24/09/03-10:42:57,fwver: v1.23 + target_bytes = b'DDR ' + target_bytes_1 = b',fwver:' + start_position = 0 + while True: + position = content.find(target_bytes, start_position) + position_1 = content.find(target_bytes_1, start_position) + if position == -1 or position_1 == -1: + break + elif (position_1 - position) < 100: + verinfo_full = content[position: position_1+30].decode('utf-8', errors='replace') + verinfo_full = verinfo_full[:verinfo_full.find('\n')] + if content[position_1 - verinfo_editable_length - 1].to_bytes(1, 'little') == b' ': + verinfo_editable_offset = position_1 - verinfo_editable_length + verinfo_full_offset = position + verinfo_full_length = len(verinfo_full.encode('utf-8')) + print("{}".format(verinfo_full)) + break + else: + start_position = position + len(target_bytes) + + if version < 2: + read_out = copy.deepcopy(sdram_head_info_v0) + write_in = copy.deepcopy(sdram_head_info_v0) + + # skip gcpu_gen_freq after version_info + filebin.seek(bin_skew_offset + 8) + elif version <= 5: + if version >= 3: + ddrbin_index.update(sdram_head_info_index_v2_3) + if version >= 4: + ddrbin_index.update(sdram_head_info_index_v3_4) + + if version < 5: + read_out = copy.deepcopy(sdram_head_info_v2) + write_in = copy.deepcopy(sdram_head_info_v2) + else: + read_out = copy.deepcopy(sdram_head_info_v5) + write_in = copy.deepcopy(sdram_head_info_v5) + + #index_info read out + for key in ddrbin_index: + try: + ddrbin_index[key]['offset'] = int.from_bytes(filebin.read(1), byteorder='little') + ddrbin_index[key]['size'] = int.from_bytes(filebin.read(1), byteorder='little') + except: + filebin.close() + print("readout ddrbin_index fail") + return -1 + #print(f"D: {key} = {index[key]}",ddrbin_index[key]["offset"],ddrbin_index[key]["size"]) + else: + filebin.close() + print("version not support") + return -1 + + if bin_data_readout(filebin, ddrbin_index, read_out, bin_skew_offset, version, info_from_txt) != 0: + filebin.close() + print("bin_data_readout failed") + return -1 + + bin_data_2_info(info_from_bin, read_out, ddrbin_index, version, info_from_txt) + if gen_txt_from_bin == 1: + if gen_info_from_bin(filegen_path, info_from_bin, verinfo_full, version) == 0: + print("generate info from bin file ok.") + filebin.close() + return 0 + else: + print("generate info fail.") + filebin.close() + return -1 + + txt_data_2_bin_data(info_from_txt, info_from_bin, ddrbin_index, write_in, version) + + if version < 2: + if version_old_hit == 0: + filebin.seek(bin_skew_offset + 8) + for i in range(len(write_in)): + try: + filebin.write(write_in[i][1].to_bytes(4,byteorder='little')) + except: + print("write bin file fail") + else: + filebin.seek(bin_skew_offset + 20) + for i in range(3, len(write_in)): + try: + filebin.write(write_in[i][1].to_bytes(4,byteorder='little')) + except: + print("write bin file fail") + elif version <= version_max: + write_in_bin_data_v2(filebin, bin_skew_offset, write_in, ddrbin_index, info_from_txt, version) + print("modify end\n") + + # update ddrbin version information to bin file + if verinfo_editable_offset != 0: + if verinfo_editable == '': + #print(f"position_1={position_1}, position_2={position_2}, {old_verinfo_editable}") + current_time = datetime.now() + verinfo_editable = current_time.strftime("%y/%m/%d-%H:%M.%S") + if len(verinfo_editable) < verinfo_editable_length: + verinfo_editable = verinfo_editable.ljust(verinfo_editable_length) + + verinfo_editable_bytes = verinfo_editable.encode('utf-8')[:verinfo_editable_length] + try: + filebin.seek(verinfo_editable_offset) + filebin.write(verinfo_editable_bytes) + filebin.seek(verinfo_full_offset) + new_verinfo_full = filebin.read(verinfo_full_length).decode('utf-8', errors='replace') + print("new ddrbin version information: {}".format(new_verinfo_full)) + except: + print("change verinfo_editable error") + + filebin.close() + + return 0 + + +if __name__ == '__main__': + #print(f"D: argc = {len(sys.argv)}, argv = {sys.argv}") + ddrbin_tool(len(sys.argv), sys.argv) +