File Comparison Report
C:\Users\richardm\OneDrive - Samtec\Documents\research\MLSE\read_ParamConfigFile.m vs. C:\Users\richardm\OneDrive - Samtec\COM\COM\src\com_fcts\read_ParamConfigFile.m
richardm
12-Aug-2024
Files
Left File | Right File | |
File name | read_ParamConfigFile | read_ParamConfigFile |
File path | C:\Users\richardm\OneDrive - Samtec\Documents\research\MLSE | C:\Users\richardm\OneDrive - Samtec\COM\COM\src\com_fcts |
Last modified | 12-Aug-2024 10:42:32 | 18-Jun-2024 11:29:37 |
Environment
MATLAB | 9.14 (R2023a) |
Comparison Results
+ | Insertion | − | Deletion | ≠ | Modification |
1 | function [param,OP]= read_ParamConfigFile(paramFile,OP) | 1 | function [param,OP]= read_ParamConfigFile(paramFile,OP) | ||
2 | %warning('off','MATLAB:xlsread:Mode'); % suppress warning messages for reading the settings file from XLS | 2 | %warning('off','MATLAB:xlsread:Mode'); % suppress warning messages for reading the settings file from XLS | ||
3 | [filepath,name,ext] = fileparts(paramFile); | 3 | [filepath,name,ext] = fileparts(paramFile); | ||
4 | if ~isempty(filepath) | 4 | if ~isempty(filepath) | ||
5 | filepath=[filepath '\']; | 5 | filepath=[filepath '\']; | ||
6 | end | 6 | end | ||
7 | matcongfile=[filepath name '.mat']; | 7 | matcongfile=[filepath name '.mat']; | ||
8 | try | 8 | try | ||
9 | switch upper(ext) | 9 | switch upper(ext) | ||
10 | case upper('.mat') | 10 | case upper('.mat') | ||
11 | load(matcongfile) | 11 | load(matcongfile) | ||
12 | case upper('.csv') | 12 | case upper('.csv') | ||
13 | [na1, na2, parameter] = xlsread(paramFile); | 13 | [na1, na2, parameter] = xlsread(paramFile); | ||
14 | otherwise | 14 | otherwise | ||
15 | [na1, na2, parameter] = xlsread(paramFile,'COM_Settings','',''); %#ok<ASGLU> % Import data from the settings file (imports the entire sheet) | 15 | [na1, na2, parameter] = xlsread(paramFile,'COM_Settings','',''); %#ok<ASGLU> % Import data from the settings file (imports the entire sheet) | ||
16 | end | 16 | end | ||
17 |
| 17 |
| ||
18 | catch ME %#ok<NASGU> | 18 | catch ME %#ok<NASGU> | ||
19 | warning('off','MATLAB:xlsread:Mode'); % suppress warning messages for reading the settings file from XLS | 19 | warning('off','MATLAB:xlsread:Mode'); % suppress warning messages for reading the settings file from XLS | ||
20 | switch upper(ext) | 20 | switch upper(ext) | ||
21 | case upper('.mat') | 21 | case upper('.mat') | ||
22 | load(matcongfile) | 22 | load(matcongfile) | ||
23 | case upper('.csv') | 23 | case upper('.csv') | ||
24 | [na1, na2, parameter] = xlsread(paramFile); | 24 | [na1, na2, parameter] = xlsread(paramFile); | ||
25 | otherwise | 25 | otherwise | ||
26 | [na1, na2, parameter] = xlsread(paramFile,'COM_Settings','','basic'); %#ok<ASGLU> % Import data from the settings file (imports the entire sheet) | 26 | [na1, na2, parameter] = xlsread(paramFile,'COM_Settings','','basic'); %#ok<ASGLU> % Import data from the settings file (imports the entire sheet) | ||
27 | end | 27 | end | ||
28 | end | 28 | end | ||
29 | 29 | ||||
30 | %% New section to parse .START package data | 30 | %% New section to parse .START package data | ||
31 | first_column_data = parameter(:,1); | 31 | first_column_data = parameter(:,1); | ||
32 | start_data_rows = find(strcmp(first_column_data,'.START')); | 32 | start_data_rows = find(strcmp(first_column_data,'.START')); | ||
33 | if ~isempty(start_data_rows) | 33 | if ~isempty(start_data_rows) | ||
34 | end_data_rows = find(strcmp(first_column_data,'.END')); | 34 | end_data_rows = find(strcmp(first_column_data,'.END')); | ||
35 | if length(start_data_rows) ~= length(end_data_rows) | 35 | if length(start_data_rows) ~= length(end_data_rows) | ||
36 | error('Number of .START and .END must be the same'); | 36 | error('Number of .START and .END must be the same'); | ||
37 | end | 37 | end | ||
38 | first_start_row = start_data_rows(1); | 38 | first_start_row = start_data_rows(1); | ||
39 | special_parameter = parameter; | 39 | special_parameter = parameter; | ||
40 | parameter = parameter(1:first_start_row-1,:); | 40 | parameter = parameter(1:first_start_row-1,:); | ||
41 | for j=1:length(start_data_rows) | 41 | for j=1:length(start_data_rows) | ||
42 | this_block = special_parameter(start_data_rows(j)+1:end_data_rows(j)-1,:); | 42 | this_block = special_parameter(start_data_rows(j)+1:end_data_rows(j)-1,:); | ||
43 | pkg_name = special_parameter{start_data_rows(j),2}; | 43 | pkg_name = special_parameter{start_data_rows(j),2}; | ||
44 |
| 44 |
| ||
45 | %Read all the parameters that make up a package | 45 | %Read all the parameters that make up a package | ||
46 | PKG_param = read_package_parameters(this_block); | 46 | PKG_param = read_package_parameters(this_block); | ||
47 |
| 47 |
| ||
48 | %save the data in a field revealed by pkg_name | 48 | %save the data in a field revealed by pkg_name | ||
49 | param.PKG.(pkg_name) = PKG_param; | 49 | param.PKG.(pkg_name) = PKG_param; | ||
50 |
| 50 |
| ||
51 |
| 51 |
| ||
52 | end | 52 | end | ||
53 | end | 53 | end | ||
54 | %Allow specification of TX and RX package section through PKG_NAME keyword | 54 | %Allow specification of TX and RX package section through PKG_NAME keyword | ||
55 | %the values must match package blocks specified in .START sections | 55 | %the values must match package blocks specified in .START sections | ||
56 | param.PKG_NAME= xls_parameter(parameter, 'PKG_NAME', false,''); | 56 | param.PKG_NAME= xls_parameter(parameter, 'PKG_NAME', false,''); | ||
57 | if isnan(param.PKG_NAME) | 57 | if isnan(param.PKG_NAME) | ||
58 | param.PKG_NAME = ''; | 58 | param.PKG_NAME = ''; | ||
59 | end | 59 | end | ||
60 | if isempty(param.PKG_NAME) | 60 | if isempty(param.PKG_NAME) | ||
61 | param.PKG_NAME = {}; | 61 | param.PKG_NAME = {}; | ||
62 | else | 62 | else | ||
63 | param.PKG_NAME = strsplit(param.PKG_NAME); | 63 | param.PKG_NAME = strsplit(param.PKG_NAME); | ||
64 | end | 64 | end | ||
65 | if ~isempty(param.PKG_NAME) && ~isfield(param,'PKG') | 65 | if ~isempty(param.PKG_NAME) && ~isfield(param,'PKG') | ||
66 | error('PKG_NAME can only be used if .START blocks for package parameters are used'); | 66 | error('PKG_NAME can only be used if .START blocks for package parameters are used'); | ||
67 | end | 67 | end | ||
68 | for j=1:length(param.PKG_NAME) | 68 | for j=1:length(param.PKG_NAME) | ||
69 | if ~isfield(param.PKG,param.PKG_NAME{j}) | 69 | if ~isfield(param.PKG,param.PKG_NAME{j}) | ||
70 | error('Package Block "%s" not found',param.PKG_NAME{j}); | 70 | error('Package Block "%s" not found',param.PKG_NAME{j}); | ||
71 | end | 71 | end | ||
72 | end | 72 | end | ||
73 | 73 | ||||
74 | %% | 74 | %% | ||
75 | % just need to define so we can pass | 75 | % just need to define so we can pass | ||
76 | param.c=[.4e-12 .4e-12]; | 76 | param.c=[.4e-12 .4e-12]; | ||
77 | param.alen=[ 20 30 550 ]; | 77 | param.alen=[ 20 30 550 ]; | ||
78 | param.az=[100 120 100]; | 78 | param.az=[100 120 100]; | ||
79 | 79 | ||||
80 | % make control for package/channel reflection control | 80 | % make control for package/channel reflection control | ||
81 | param.kappa1= xls_parameter(parameter, 'kappa1', true,1); % if set 0 reflection at tp0 are omitted from COM | 81 | param.kappa1= xls_parameter(parameter, 'kappa1', true,1); % if set 0 reflection at tp0 are omitted from COM | ||
82 | param.kappa2= xls_parameter(parameter, 'kappa2', true,1); % if set 0 reflection at tp5 are omitted from COM | 82 | param.kappa2= xls_parameter(parameter, 'kappa2', true,1); % if set 0 reflection at tp5 are omitted from COM | ||
| + | 83 | |||
83 | 84 | ||||
84 | % make compatible with presentation of kappa | 85 | % make compatible with presentation of kappa | ||
| + | 86 | |||
85 | % Default values are given for parameters when they are common to all clauses in 802.3bj and 803.2bm. | 87 | % Default values are given for parameters when they are common to all clauses in 802.3bj and 803.2bm. | ||
86 | 88 | ||||
87 | OP.dynamic_txffe = xls_parameter(parameter, 'Dynamic TXFFE', false,1); % Temporary switch for testing new optimize_fom with dynamic txffe | 89 | OP.dynamic_txffe = xls_parameter(parameter, 'Dynamic TXFFE', false,1); % Temporary switch for testing new optimize_fom with dynamic txffe | ||
88 | OP.FloatingDFE_Development = xls_parameter(parameter, 'FloatingDFE_Development', false,1); % Temporary switch for testing new floating dfe routine | 90 | OP.FloatingDFE_Development = xls_parameter(parameter, 'FloatingDFE_Development', false,1); % Temporary switch for testing new floating dfe routine | ||
89 | 91 | ||||
90 | param.fb = xls_parameter(parameter, 'f_b')*1e9; % Baud (Signaling) rate in Gbaud | 92 | param.fb = xls_parameter(parameter, 'f_b')*1e9; % Baud (Signaling) rate in Gbaud | ||
91 | param.f2 = xls_parameter(parameter, 'f_2', true, param.fb/1e9 )*1e9; % frequency in GHz for intergration compuation of ICN or FOM_Ild in GHz | 93 | param.f2 = xls_parameter(parameter, 'f_2', true, param.fb/1e9 )*1e9; % frequency in GHz for intergration compuation of ICN or FOM_Ild in GHz | ||
92 | param.max_start_freq = xls_parameter(parameter, 'f_min')*1e9; % minimum required frequency start for s parameters | 94 | param.max_start_freq = xls_parameter(parameter, 'f_min')*1e9; % minimum required frequency start for s parameters | ||
93 | param.f1 = xls_parameter(parameter, 'f_1', true, param.max_start_freq/1e9)*1e9; % start frequency for ICN and ILD calculations in GHz | 95 | param.f1 = xls_parameter(parameter, 'f_1', true, param.max_start_freq/1e9)*1e9; % start frequency for ICN and ILD calculations in GHz | ||
94 | param.max_freq_step = xls_parameter(parameter, 'Delta_f')*1e9; % freqency step | 96 | param.max_freq_step = xls_parameter(parameter, 'Delta_f')*1e9; % freqency step | ||
95 | param.tx_ffe_c0_min = xls_parameter(parameter, 'c(0)', false); % TX equalizer cursor minimum value (actual value is calculated as 1-sum(abs(tap)), Grid seat ingored for when C(0) is below this value | 97 | param.tx_ffe_c0_min = xls_parameter(parameter, 'c(0)', false); % TX equalizer cursor minimum value (actual value is calculated as 1-sum(abs(tap)), Grid seat ingored for when C(0) is below this value | ||
96 | 98 | ||||
97 | if OP.dynamic_txffe | 99 | if OP.dynamic_txffe | ||
98 | found_pre=1; | 100 | found_pre=1; | ||
99 | pre_count=1; | 101 | pre_count=1; | ||
100 | while found_pre | 102 | while found_pre | ||
101 | [p,found_pre]=xls_parameter_txffe(parameter,sprintf('c(-%d)',pre_count)); | 103 | [p,found_pre]=xls_parameter_txffe(parameter,sprintf('c(-%d)',pre_count)); | ||
102 | if found_pre | 104 | if found_pre | ||
103 | field_name=sprintf('tx_ffe_cm%d_values',pre_count); | 105 | field_name=sprintf('tx_ffe_cm%d_values',pre_count); | ||
104 | param.(field_name)=p; | 106 | param.(field_name)=p; | ||
105 | pre_count=pre_count+1; | 107 | pre_count=pre_count+1; | ||
106 | end | 108 | end | ||
107 | end | 109 | end | ||
108 | found_post=1; | 110 | found_post=1; | ||
109 | post_count=1; | 111 | post_count=1; | ||
110 | while found_post | 112 | while found_post | ||
111 | [p,found_post]=xls_parameter_txffe(parameter,sprintf('c(%d)',post_count)); | 113 | [p,found_post]=xls_parameter_txffe(parameter,sprintf('c(%d)',post_count)); | ||
112 | if found_post | 114 | if found_post | ||
113 | field_name=sprintf('tx_ffe_cp%d_values',post_count); | 115 | field_name=sprintf('tx_ffe_cp%d_values',post_count); | ||
114 | param.(field_name)=p; | 116 | param.(field_name)=p; | ||
115 | post_count=post_count+1; | 117 | post_count=post_count+1; | ||
116 | end | 118 | end | ||
117 | end | 119 | end | ||
118 | else | 120 | else | ||
119 | param.tx_ffe_cm4_values = xls_parameter(parameter, 'c(-4)', true,0); % TX equalizer pre cursor tap -4 individual settings or range. If not present ignored | 121 | param.tx_ffe_cm4_values = xls_parameter(parameter, 'c(-4)', true,0); % TX equalizer pre cursor tap -4 individual settings or range. If not present ignored | ||
120 | param.tx_ffe_cm3_values = xls_parameter(parameter, 'c(-3)', true,0); % TX equalizer pre cursor tap -3 individual settings or range. If not present ignored | 122 | param.tx_ffe_cm3_values = xls_parameter(parameter, 'c(-3)', true,0); % TX equalizer pre cursor tap -3 individual settings or range. If not present ignored | ||
121 | param.tx_ffe_cm2_values = xls_parameter(parameter, 'c(-2)', true,0); % TX equalizer pre cursor tap -2 individual settings or range. If not present ignored | 123 | param.tx_ffe_cm2_values = xls_parameter(parameter, 'c(-2)', true,0); % TX equalizer pre cursor tap -2 individual settings or range. If not present ignored | ||
122 | param.tx_ffe_cm1_values = xls_parameter(parameter, 'c(-1)', true,0); % TX equalizer pre cursor tap -1 individual settings or range. If not present ignored | 124 | param.tx_ffe_cm1_values = xls_parameter(parameter, 'c(-1)', true,0); % TX equalizer pre cursor tap -1 individual settings or range. If not present ignored | ||
123 | param.tx_ffe_cp1_values = xls_parameter(parameter, 'c(1)', true,0); % TX equalizer post cursor tap 1 individual settings or range. If not present ignored | 125 | param.tx_ffe_cp1_values = xls_parameter(parameter, 'c(1)', true,0); % TX equalizer post cursor tap 1 individual settings or range. If not present ignored | ||
124 | param.tx_ffe_cp2_values = xls_parameter(parameter, 'c(2)', true,0); % TX equalizer post cursor tap 2 individual settings or range. If not present ignored | 126 | param.tx_ffe_cp2_values = xls_parameter(parameter, 'c(2)', true,0); % TX equalizer post cursor tap 2 individual settings or range. If not present ignored | ||
125 | param.tx_ffe_cp3_values = xls_parameter(parameter, 'c(3)', true,0); % TX equalizer post cursor tap 3 individual settings or range. If not present ignored | 127 | param.tx_ffe_cp3_values = xls_parameter(parameter, 'c(3)', true,0); % TX equalizer post cursor tap 3 individual settings or range. If not present ignored | ||
126 | end | 128 | end | ||
127 | param.ndfe = xls_parameter(parameter, 'N_b'); % Decision feedback fixed equalizer (DFE) length | 129 | param.ndfe = xls_parameter(parameter, 'N_b'); % Decision feedback fixed equalizer (DFE) length | ||
128 | param.N_v = xls_parameter(parameter, 'N_v',true,param.ndfe); % number of UI used to compute Vf | 130 | param.N_v = xls_parameter(parameter, 'N_v',true,param.ndfe); % number of UI used to compute Vf | ||
129 | param.D_p = xls_parameter(parameter, 'D_p',true, 4 ); % number of precursor UI's used to compute Vf Default to 10 | 131 | param.D_p = xls_parameter(parameter, 'D_p',true, 4 ); % number of precursor UI's used to compute Vf Default to 10 | ||
130 | param.N_bx = xls_parameter(parameter, 'N_bx', true, param.ndfe ); % Used for ERL to Compensate for a number of Ui assoicated with the DFE | 132 | param.N_bx = xls_parameter(parameter, 'N_bx', true, param.ndfe ); % Used for ERL to Compensate for a number of Ui assoicated with the DFE | ||
131 | % support for floating taps | 133 | % support for floating taps | ||
132 | param.N_bg=xls_parameter(parameter, 'N_bg', true,0); % number of group of floating tap. Used as a switch, 0 means no float | 134 | param.N_bg=xls_parameter(parameter, 'N_bg', true,0); % number of group of floating tap. Used as a switch, 0 means no float | ||
133 | param.N_bf=xls_parameter(parameter, 'N_bf', true,6); % number of taps in group | 135 | param.N_bf=xls_parameter(parameter, 'N_bf', true,6); % number of taps in group | ||
134 | param.N_bmax=xls_parameter(parameter, 'N_bmax', true, param.ndfe); % UI span for floating taps | 136 | param.N_bmax=xls_parameter(parameter, 'N_bmax', true, param.ndfe); % UI span for floating taps | ||
135 | param.N_bmax=xls_parameter(parameter, 'N_f', true, param.ndfe); % UI span for floating taps. replaced by N_bmax | 137 | param.N_bmax=xls_parameter(parameter, 'N_f', true, param.ndfe); % UI span for floating taps. replaced by N_bmax | ||
136 | param.N_f=xls_parameter(parameter, 'N_f', true, param.ndfe); % UI span for floating taps for rX FFE | 138 | param.N_f=xls_parameter(parameter, 'N_f', true, param.ndfe); % UI span for floating taps for rX FFE | ||
137 | if param.N_bg == 0, param.N_bmax=param.ndfe; end | 139 | if param.N_bg == 0, param.N_bmax=param.ndfe; end | ||
138 | param.bmaxg=xls_parameter(parameter, 'bmaxg', true,0.2); % max DFE value for floating taps | 140 | param.bmaxg=xls_parameter(parameter, 'bmaxg', true,0.2); % max DFE value for floating taps | ||
139 | 141 | ||||
140 | % support for tail tap power limitations | 142 | % support for tail tap power limitations | ||
141 | param.B_float_RSS_MAX=xls_parameter(parameter, 'B_float_RSS_MAX', true,0); % floating DFE tap start for RSS floating tap limit | 143 | param.B_float_RSS_MAX=xls_parameter(parameter, 'B_float_RSS_MAX', true,0); % floating DFE tap start for RSS floating tap limit | ||
142 | param.N_tail_start=xls_parameter(parameter, 'N_tail_start', true,0); % start range for max RSS limit for DFE taps | 144 | param.N_tail_start=xls_parameter(parameter, 'N_tail_start', true,0); % start range for max RSS limit for DFE taps | ||
143 | % | 145 | % | ||
144 | param.dfe_delta = xls_parameter(parameter, 'N_b_step', true,0); % discreatiztion of DFE, 0 disables and is not normally used | 146 | param.dfe_delta = xls_parameter(parameter, 'N_b_step', true,0); % discreatiztion of DFE, 0 disables and is not normally used | ||
145 | param.ffe_pre_tap_len=xls_parameter(parameter, 'ffe_pre_tap_len', true,0); % RX ffe pre cursor tap length | 147 | param.ffe_pre_tap_len=xls_parameter(parameter, 'ffe_pre_tap_len', true,0); % RX ffe pre cursor tap length | ||
146 | param.RxFFE_cmx=param.ffe_pre_tap_len; | 148 | param.RxFFE_cmx=param.ffe_pre_tap_len; | ||
147 | param.ffe_post_tap_len=xls_parameter(parameter, 'ffe_post_tap_len', true,0); % Rx FFE post cursor tap length | 149 | param.ffe_post_tap_len=xls_parameter(parameter, 'ffe_post_tap_len', true,0); % Rx FFE post cursor tap length | ||
148 | param.RxFFE_cpx=param.ffe_post_tap_len; | 150 | param.RxFFE_cpx=param.ffe_post_tap_len; | ||
149 | param.ffe_tap_step_size=xls_parameter(parameter, 'ffe_tap_step_size', true,0); % Rx FFE tap step size | 151 | param.ffe_tap_step_size=xls_parameter(parameter, 'ffe_tap_step_size', true,0); % Rx FFE tap step size | ||
150 | param.RxFFE_stepz=param.ffe_tap_step_size; | 152 | param.RxFFE_stepz=param.ffe_tap_step_size; | ||
151 | param.ffe_main_cursor_min=xls_parameter(parameter, 'ffe_main_cursor_min', true,1); % Rx FFE main cursor miminum | 153 | param.ffe_main_cursor_min=xls_parameter(parameter, 'ffe_main_cursor_min', true,1); % Rx FFE main cursor miminum | ||
152 | param.ffe_pre_tap1_max=xls_parameter(parameter, 'ffe_pre_tap1_max', true,.7); % Rx FFE precursor tap1 limit | 154 | param.ffe_pre_tap1_max=xls_parameter(parameter, 'ffe_pre_tap1_max', true,.7); % Rx FFE precursor tap1 limit | ||
153 | param.ffe_post_tap1_max=xls_parameter(parameter, 'ffe_post_tap1_max', true,.7); % Rx FFE post cursor tap1 limit | 155 | param.ffe_post_tap1_max=xls_parameter(parameter, 'ffe_post_tap1_max', true,.7); % Rx FFE post cursor tap1 limit | ||
154 | param.ffe_tapn_max=xls_parameter(parameter, 'ffe_tapn_max', true,.7); % Rx FFE precursor tapn limit | 156 | param.ffe_tapn_max=xls_parameter(parameter, 'ffe_tapn_max', true,.7); % Rx FFE precursor tapn limit | ||
155 | param.ffe_backoff=xls_parameter(parameter, 'ffe_backoff', true,0); % see if better zero foreced solution is better by backing off the number specified FFE taps one at at time | 157 | param.ffe_backoff=xls_parameter(parameter, 'ffe_backoff', true,0); % see if better zero foreced solution is better by backing off the number specified FFE taps one at at time | ||
156 | if param.RxFFE_cmx ~= 0 || param.RxFFE_cpx ~=0 | 158 | if param.RxFFE_cmx ~= 0 || param.RxFFE_cpx ~=0 | ||
157 | OP.RxFFE= true; | 159 | OP.RxFFE= true; | ||
158 | else | 160 | else | ||
159 | OP.RxFFE=false; | 161 | OP.RxFFE=false; | ||
160 | end | 162 | end | ||
161 | param.num_ui_RXFF_noise=xls_parameter(parameter, 'num_ui_RXFF_noise', true,2048); % Rx FFE precursor tapn limit | 163 | param.num_ui_RXFF_noise=xls_parameter(parameter, 'num_ui_RXFF_noise', true,2048); % Rx FFE precursor tapn limit | ||
162 | 164 | ||||
163 | param.g_DC_HP_values = xls_parameter(parameter, 'g_DC_HP', true,[]); % CTF AC-DC gain list (GDC2) | 165 | param.g_DC_HP_values = xls_parameter(parameter, 'g_DC_HP', true,[]); % CTF AC-DC gain list (GDC2) | ||
164 | param.f_HP = 1e9*xls_parameter(parameter, 'f_HP_PZ', true, []); % CFT pole pole zero pair in GHz for low frequency CTF | 166 | param.f_HP = 1e9*xls_parameter(parameter, 'f_HP_PZ', true, []); % CFT pole pole zero pair in GHz for low frequency CTF | ||
165 | param.f_HP_Z = 1e9*xls_parameter(parameter, 'f_HP_Z', true, []); % CFT zero fz1 is in GHz. Normally a list for 120e. Not normally use elsewise | 167 | param.f_HP_Z = 1e9*xls_parameter(parameter, 'f_HP_Z', true, []); % CFT zero fz1 is in GHz. Normally a list for 120e. Not normally use elsewise | ||
166 | param.f_HP_P = 1e9*xls_parameter(parameter, 'f_HP_P', true, []); % CFT pole fp2 is in GHz. Normally a list for 120e. Not normally use elsewise | 168 | param.f_HP_P = 1e9*xls_parameter(parameter, 'f_HP_P', true, []); % CFT pole fp2 is in GHz. Normally a list for 120e. Not normally use elsewise | ||
167 | 169 | ||||
168 | 170 | ||||
169 | param.Min_VEO= xls_parameter(parameter, 'EH_min', true,0); % used when PMD_type is C2M | 171 | param.Min_VEO= xls_parameter(parameter, 'EH_min', true,0); % used when PMD_type is C2M | ||
170 | param.Max_VEO= xls_parameter(parameter, 'EH_max', true,inf); % used when PMD_type is C2M and is not really computed per spec | 172 | param.Max_VEO= xls_parameter(parameter, 'EH_max', true,inf); % used when PMD_type is C2M and is not really computed per spec | ||
171 | param.Min_VEO_Test= xls_parameter(parameter, 'EH_min_test', true,0); % Older syntax. Used when PMD_type is C2M. This allow EH to go below EH_min. If set to zero it is ignored (same as Min_VEO_test) | 173 | param.Min_VEO_Test= xls_parameter(parameter, 'EH_min_test', true,0); % Older syntax. Used when PMD_type is C2M. This allow EH to go below EH_min. If set to zero it is ignored (same as Min_VEO_test) | ||
172 | param.Min_VEO_Test= xls_parameter(parameter, 'Min_VEO_Test', true,param.Min_VEO_Test); % used when PMD_type is C2M. This allow EH to go blow EH_min. If set to Zero it is ignored | 174 | param.Min_VEO_Test= xls_parameter(parameter, 'Min_VEO_Test', true,param.Min_VEO_Test); % used when PMD_type is C2M. This allow EH to go blow EH_min. If set to Zero it is ignored | ||
173 | 175 | ||||
174 | param.CTLE_type= xls_parameter(parameter, 'CTLE_type', false,'CL93'); % Sets the CTLE type default is poles and zeros (i.e. not a list of poles as in 120e) | 176 | param.CTLE_type= xls_parameter(parameter, 'CTLE_type', false,'CL93'); % Sets the CTLE type default is poles and zeros (i.e. not a list of poles as in 120e) | ||
175 | if ~isempty(param.g_DC_HP_values) ; param.CTLE_type='CL120d';end % overrides CL93 if g_DC_HP_values are a spreadsheet entry. Mostly used when baud rare is >= 50Gbps | 177 | if ~isempty(param.g_DC_HP_values) ; param.CTLE_type='CL120d';end % overrides CL93 if g_DC_HP_values are a spreadsheet entry. Mostly used when baud rare is >= 50Gbps | ||
176 | if ~isempty(param.f_HP_Z) ; param.CTLE_type='CL120e';end % overrides CL93 and CL120d if f_HP_Z is a spreadsheet entry | 178 | if ~isempty(param.f_HP_Z) ; param.CTLE_type='CL120e';end % overrides CL93 and CL120d if f_HP_Z is a spreadsheet entry | ||
177 | % always read in main ctle values. They would be interpreted different baseed | 179 | % always read in main ctle values. They would be interpreted different baseed | ||
178 | % on the clause they apply because of different CTF equations | 180 | % on the clause they apply because of different CTF equations | ||
179 | param.ctle_gdc_values = xls_parameter(parameter, 'g_DC', true); % AC-DC gain list | 181 | param.ctle_gdc_values = xls_parameter(parameter, 'g_DC', true); % AC-DC gain list | ||
180 | param.CTLE_fp1 = 1e9*xls_parameter(parameter, 'f_p1', true, param.fb/4); % fp1 is in GHz | 182 | param.CTLE_fp1 = 1e9*xls_parameter(parameter, 'f_p1', true, param.fb/4); % fp1 is in GHz | ||
181 | param.CTLE_fp2 = 1e9*xls_parameter(parameter, 'f_p2', true, param.fb); % fp2 is in GHz | 183 | param.CTLE_fp2 = 1e9*xls_parameter(parameter, 'f_p2', true, param.fb); % fp2 is in GHz | ||
182 | param.CTLE_fz = 1e9*xls_parameter(parameter, 'f_z', true, param.fb/4); % fz is in GHz | 184 | param.CTLE_fz = 1e9*xls_parameter(parameter, 'f_z', true, param.fb/4); % fz is in GHz | ||
183 | % the contex of the poles an zeros are determined by the clause | 185 | % the contex of the poles an zeros are determined by the clause | ||
184 | switch param.CTLE_type | 186 | switch param.CTLE_type | ||
185 | case 'CL93' | 187 | case 'CL93' | ||
186 | param.ctle_gdc_values = xls_parameter(parameter, 'g_DC', true); % Continuous time filter DC gain settings (G_DC) or range as specified in Annex 93A | 188 | param.ctle_gdc_values = xls_parameter(parameter, 'g_DC', true); % Continuous time filter DC gain settings (G_DC) or range as specified in Annex 93A | ||
187 | param.CTLE_fp1 = 1e9*xls_parameter(parameter, 'f_p1', true, param.fb/4); % fp1 is in GHz | 189 | param.CTLE_fp1 = 1e9*xls_parameter(parameter, 'f_p1', true, param.fb/4); % fp1 is in GHz | ||
188 | param.CTLE_fp2 = 1e9*xls_parameter(parameter, 'f_p2', true, param.fb); % fp2 is in GHz | 190 | param.CTLE_fp2 = 1e9*xls_parameter(parameter, 'f_p2', true, param.fb); % fp2 is in GHz | ||
189 | param.CTLE_fz = 1e9*xls_parameter(parameter, 'f_z', true, param.fb/4); % fz is in GHz | 191 | param.CTLE_fz = 1e9*xls_parameter(parameter, 'f_z', true, param.fb/4); % fz is in GHz | ||
190 | case 'CL120d' | 192 | case 'CL120d' | ||
191 | param.g_DC_HP_values = xls_parameter(parameter, 'g_DC_HP', true,[]); % Continuous time filter DC gain settings (G_DC2) | 193 | param.g_DC_HP_values = xls_parameter(parameter, 'g_DC_HP', true,[]); % Continuous time filter DC gain settings (G_DC2) | ||
192 | param.f_HP = 1e9*xls_parameter(parameter, 'f_HP_PZ', true, []); % fLF is in GHz | 194 | param.f_HP = 1e9*xls_parameter(parameter, 'f_HP_PZ', true, []); % fLF is in GHz | ||
193 | case 'CL120e' | 195 | case 'CL120e' | ||
194 | % re adjust to get TD_CTLE to work with C:120e equation without | 196 | % re adjust to get TD_CTLE to work with C:120e equation without | ||
195 | % changing TD_CTLE code | 197 | % changing TD_CTLE code | ||
196 | param.CTLE_fz =param.CTLE_fz ./ 10.^(param.ctle_gdc_values/20); | 198 | param.CTLE_fz =param.CTLE_fz ./ 10.^(param.ctle_gdc_values/20); | ||
197 | end | 199 | end | ||
198 | param.GDC_MIN = xls_parameter(parameter, 'GDC_MIN',true, 0); % max ACDC gain, if 0 ignore | 200 | param.GDC_MIN = xls_parameter(parameter, 'GDC_MIN',true, 0); % max ACDC gain, if 0 ignore | ||
199 | param.cursor_gain=xls_parameter(parameter, 'crusor_gain', true,0); % only FFE and not supported | 201 | param.cursor_gain=xls_parameter(parameter, 'crusor_gain', true,0); % only FFE and not supported | ||
− | 200 | %% addd default to support multiple packages |
| ||
≠ | 201 | param.a_thru = xls_parameter(parameter, 'A_v', true, 0.5); % Victim differential peak source output voltage (half of peak to peak) | ≠ | 202 | param.a_thru = xls_parameter(parameter, 'A_v', true); % Victim differential peak source output voltage (half of peak to peak) |
≠ | 202 | param.a_fext = xls_parameter(parameter, 'A_fe', true,0.5); % FEXT aggressor differential peak source output voltage (half of peak to peak) | ≠ | 203 | param.a_fext = xls_parameter(parameter, 'A_fe', true); % FEXT aggressor differential peak source output voltage (half of peak to peak) |
≠ | 203 | param.a_next = xls_parameter(parameter, 'A_ne', true,0.5); % NEXT aggressor differential peak source output voltage (half of peak to peak) | ≠ | 204 | param.a_next = xls_parameter(parameter, 'A_ne', true); % NEXT aggressor differential peak source output voltage (half of peak to peak) |
204 | param.a_icn_fext = xls_parameter(parameter, 'A_ft', true, param.a_fext); % FEXT aggressor amplitude for ICN. Defaults to A_fe if not specified | 205 | param.a_icn_fext = xls_parameter(parameter, 'A_ft', true, param.a_fext); % FEXT aggressor amplitude for ICN. Defaults to A_fe if not specified | ||
205 | param.a_icn_next = xls_parameter(parameter, 'A_nt', true, param.a_next );% NEXT aggressor amplitude for ICN. Defaults to A_ne if not specified | 206 | param.a_icn_next = xls_parameter(parameter, 'A_nt', true, param.a_next );% NEXT aggressor amplitude for ICN. Defaults to A_ne if not specified | ||
206 | param.levels = xls_parameter(parameter, 'L'); % number of symbols levels (PAM-4 is 4, NRZ is 2) | 207 | param.levels = xls_parameter(parameter, 'L'); % number of symbols levels (PAM-4 is 4, NRZ is 2) | ||
207 | param.specBER = xls_parameter(parameter, 'DER_0'); % Target detector error ratio | 208 | param.specBER = xls_parameter(parameter, 'DER_0'); % Target detector error ratio | ||
208 | param.DER_CDR = xls_parameter(parameter, 'DER_CDR',true,1e-2); % min DER required for a CDR | 209 | param.DER_CDR = xls_parameter(parameter, 'DER_CDR',true,1e-2); % min DER required for a CDR | ||
209 | param.pass_threshold = xls_parameter(parameter, 'COM Pass threshold',false,0); % the pass fail threshold for COM in dB | 210 | param.pass_threshold = xls_parameter(parameter, 'COM Pass threshold',false,0); % the pass fail threshold for COM in dB | ||
210 | param.ERL_pass_threshold = xls_parameter(parameter, 'ERL Pass threshold',false,0); % the pass fail threshold for ERL in dB | 211 | param.ERL_pass_threshold = xls_parameter(parameter, 'ERL Pass threshold',false,0); % the pass fail threshold for ERL in dB | ||
211 | param.VEC_pass_threshold = xls_parameter(parameter, 'VEC Pass threshold',false,0);% the pass fail threshold for VEC in dB only used when PMD_type is C2M | 212 | param.VEC_pass_threshold = xls_parameter(parameter, 'VEC Pass threshold',false,0);% the pass fail threshold for VEC in dB only used when PMD_type is C2M | ||
212 | 213 | ||||
213 | param.sigma_RJ = xls_parameter(parameter, 'sigma_RJ'); % rms of of random jitter | 214 | param.sigma_RJ = xls_parameter(parameter, 'sigma_RJ'); % rms of of random jitter | ||
214 | param.A_DD = xls_parameter(parameter, 'A_DD'); % Normalized peak dual-Dirac noise, this is half of the total bound uncorrelated jitter (BUJ) in UI | 215 | param.A_DD = xls_parameter(parameter, 'A_DD'); % Normalized peak dual-Dirac noise, this is half of the total bound uncorrelated jitter (BUJ) in UI | ||
215 | param.eta_0 = xls_parameter(parameter, 'eta_0'); % One-sided noise spectral density (V^2/GHz).Input refered noise at TP5. Input referred noise at TP5 | 216 | param.eta_0 = xls_parameter(parameter, 'eta_0'); % One-sided noise spectral density (V^2/GHz).Input refered noise at TP5. Input referred noise at TP5 | ||
− | 216 | % shakiba_3dj_01_2407 (to add MLSE sequence truncation penalty) |
| ||
217 | param.trunc = xls_parameter(parameter, 'trunc', true, 128); % MLSE sequence truncation length | ||||
218 | param.trunc = xls_parameter(parameter, 'N_tc', true, param.trunc); % MLSE sequence truncation length | ||||
219 | |||||
220 | % healey_3dj_01a_2407 adjust MLSE for COM_DFE | ||||
221 | param.Q_budget_adj = xls_parameter(parameter, 'Q_budget_adj', true, 0); % MLSE sequence truncation length | ||||
222 | param.SNDR = xls_parameter(parameter, 'SNR_TX', true); % Transmitter SNDR noise in dB | 217 | param.SNDR = xls_parameter(parameter, 'SNR_TX', true); % Transmitter SNDR noise in dB | ||
223 | param.R_LM = xls_parameter(parameter, 'R_LM'); % Ratio of level separation mismatch. Relevant when not PAM-2 (NRZ). | 218 | param.R_LM = xls_parameter(parameter, 'R_LM'); % Ratio of level separation mismatch. Relevant when not PAM-2 (NRZ). | ||
224 | param.samples_per_ui = xls_parameter(parameter, 'M', 32); % Samples per UI | 219 | param.samples_per_ui = xls_parameter(parameter, 'M', 32); % Samples per UI | ||
225 | param.ts_sample_adj_range = xls_parameter(parameter, 'sample_adjustment', true, [0 0]); %sample point adjustment range | 220 | param.ts_sample_adj_range = xls_parameter(parameter, 'sample_adjustment', true, [0 0]); %sample point adjustment range | ||
226 | param.ts_anchor = xls_parameter(parameter, 'ts_anchor', true, 0); %choice of sampling routine. 0=MM, 1=Peak, 2=max DV (max cursor minus precursor) | 221 | param.ts_anchor = xls_parameter(parameter, 'ts_anchor', true, 0); %choice of sampling routine. 0=MM, 1=Peak, 2=max DV (max cursor minus precursor) | ||
227 | % This will keep bmax length 0 if Nb=0 | 222 | % This will keep bmax length 0 if Nb=0 | ||
228 | 223 | ||||
229 | %AJG021820 | 224 | %AJG021820 | ||
230 | param.bmax(1:param.ndfe) = xls_parameter(parameter, 'b_max(1)'); % DFE magnitude limit, first coefficient(ignored if Nb=0) | 225 | param.bmax(1:param.ndfe) = xls_parameter(parameter, 'b_max(1)'); % DFE magnitude limit, first coefficient(ignored if Nb=0) | ||
231 | if isempty(param.bmax) | 226 | if isempty(param.bmax) | ||
232 | param.bmin=param.bmax; | 227 | param.bmin=param.bmax; | ||
233 | else | 228 | else | ||
234 | param.bmin(1:param.ndfe) =xls_parameter(parameter, 'b_min(1)', true,-param.bmax(1) ); % DFE negative magnitude limit. If not specified it defaults to -bmax. | 229 | param.bmin(1:param.ndfe) =xls_parameter(parameter, 'b_min(1)', true,-param.bmax(1) ); % DFE negative magnitude limit. If not specified it defaults to -bmax. | ||
235 | 230 | ||||
236 | end | 231 | end | ||
237 | if param.ndfe >= 2 | 232 | if param.ndfe >= 2 | ||
238 | param.bmax(2:param.ndfe) = xls_parameter(parameter, 'b_max(2..N_b)', true, .2); % DFE magnitude limit, second coefficient and on (ignored if Nb<2). Can be a regualar expression | 233 | param.bmax(2:param.ndfe) = xls_parameter(parameter, 'b_max(2..N_b)', true, .2); % DFE magnitude limit, second coefficient and on (ignored if Nb<2). Can be a regualar expression | ||
239 | param.bmin(2:param.ndfe) = xls_parameter(parameter, 'b_min(2..N_b)', true, -1*param.bmax(2:param.ndfe) ); % DFE negative magnitude limit, if not specified it defaults to -b_max(2..N_b) | 234 | param.bmin(2:param.ndfe) = xls_parameter(parameter, 'b_min(2..N_b)', true, -1*param.bmax(2:param.ndfe) ); % DFE negative magnitude limit, if not specified it defaults to -b_max(2..N_b) | ||
240 | end | 235 | end | ||
241 | 236 | ||||
242 | param.gqual=xls_parameter(parameter, 'G_Qual', true,[]);% G_Qual are the dB ranges of g_DC g DC )which correspond tog_DC_HP (g DC2) | 237 | param.gqual=xls_parameter(parameter, 'G_Qual', true,[]);% G_Qual are the dB ranges of g_DC g DC )which correspond tog_DC_HP (g DC2) | ||
243 | param.g2qual=xls_parameter(parameter, 'G2_Qual', true,[]); % G2_Qual limit values of g_DC_HP (g DC2 ) which corresponds to ranges of g_DC g DC specified with G_QUAL | 238 | param.g2qual=xls_parameter(parameter, 'G2_Qual', true,[]); % G2_Qual limit values of g_DC_HP (g DC2 ) which corresponds to ranges of g_DC g DC specified with G_QUAL | ||
244 | %verify gqual and gqual2 input | 239 | %verify gqual and gqual2 input | ||
245 | if ~isempty(param.gqual) || ~isempty(param.g2qual) | 240 | if ~isempty(param.gqual) || ~isempty(param.g2qual) | ||
246 | if size(param.gqual,1)~=length(param.g2qual) | 241 | if size(param.gqual,1)~=length(param.g2qual) | ||
247 | error('gqual and g2qual size mismatch'); | 242 | error('gqual and g2qual size mismatch'); | ||
248 | end | 243 | end | ||
249 | if size(param.gqual,2)~=2 | 244 | if size(param.gqual,2)~=2 | ||
250 | error('gqual must be Nx2 matrix'); | 245 | error('gqual must be Nx2 matrix'); | ||
251 | end | 246 | end | ||
252 | end | 247 | end | ||
253 | 248 | ||||
254 | 249 | ||||
255 | % eval if string for all three - can use different for TX and RX | 250 | % eval if string for all three - can use different for TX and RX | ||
≠ | 256 | param.C_pkg_board = xls_parameter(parameter, 'C_p', true,0)*1e-9; % C_p in nF (single sided) | ≠ | 251 | param.C_pkg_board = xls_parameter(parameter, 'C_p', true)*1e-9; % C_p in nF (single sided) |
≠ | 257 | param.C_diepad = xls_parameter(parameter, 'C_d', true,0)*1e-9; % C_d in nF (single sided) | ≠ | 252 | param.C_diepad = xls_parameter(parameter, 'C_d', true)*1e-9; % C_d in nF (single sided) |
258 | % [ahealey] Read values for optional compensating L and "bump" C | 253 | % [ahealey] Read values for optional compensating L and "bump" C | ||
259 | param.L_comp = xls_parameter(parameter, 'L_s', true, 0)*1e-9; % L_s in nH (single sided) | 254 | param.L_comp = xls_parameter(parameter, 'L_s', true, 0)*1e-9; % L_s in nH (single sided) | ||
260 | param.C_bump = xls_parameter(parameter, 'C_b', true, 0)*1e-9; % C_b in nF (single sided) | 255 | param.C_bump = xls_parameter(parameter, 'C_b', true, 0)*1e-9; % C_b in nF (single sided) | ||
≠ | 261 | % [ahealey] End of modification | ≠ | 256 | % [ahealey] End of modifications. |
− | 262 | % added default to support multiple packages |
| ||
263 | param.C_v = xls_parameter(parameter, 'C_v', true,0)*1e-9; % C_v in nF (via cap) (single sided) | 257 | param.C_v = xls_parameter(parameter, 'C_v', true,0)*1e-9; % C_v in nF (via cap) (single sided) | ||
≠ | 264 | param.R_diepad = xls_parameter(parameter, 'R_d', true, [50,50]); % Die source termination resistance (single sided) | ≠ | 258 | param.R_diepad = xls_parameter(parameter, 'R_d', true); % Die source termination resistance (single sided) |
265 | param.Z_t = xls_parameter(parameter, 'Z_t', true,50); % single sided source termination reference resistance for TDR and ERL | 259 | param.Z_t = xls_parameter(parameter, 'Z_t', true,50); % single sided source termination reference resistance for TDR and ERL | ||
266 | param.TR_TDR = xls_parameter(parameter, 'TR_TDR', true , 8e-3); % Gaussian shaped transition time for TDR source in ns | 260 | param.TR_TDR = xls_parameter(parameter, 'TR_TDR', true , 8e-3); % Gaussian shaped transition time for TDR source in ns | ||
267 | 261 | ||||
268 | 262 | ||||
269 | param.Z0 = xls_parameter(parameter, 'R_0', 50); % | 263 | param.Z0 = xls_parameter(parameter, 'R_0', 50); % | ||
− | 270 | % added default to support multiple packages |
| ||
≠ | 271 | param.z_p_tx_cases = xls_parameter(parameter, 'z_p (TX)', true,'[ 8 24 30 45 ; 1 1 1 1; 1 1 1 1 ; 0.5 0.5 0.5 0.5 ]').'; % List of victim transmitter package trace lengths in mm, one per case | ≠ | 264 | param.z_p_tx_cases = xls_parameter(parameter, 'z_p (TX)', true).'; % List of victim transmitter package trace lengths in mm, one per case |
272 | [ncases, mele]=size(param.z_p_tx_cases); | 265 | [ncases, mele]=size(param.z_p_tx_cases); | ||
273 | if mele ==2 | 266 | if mele ==2 | ||
274 | param.flex=2; | 267 | param.flex=2; | ||
275 | elseif mele==4 | 268 | elseif mele==4 | ||
276 | param.flex=4; | 269 | param.flex=4; | ||
277 | elseif mele==1 | 270 | elseif mele==1 | ||
278 | param.flex=1; | 271 | param.flex=1; | ||
279 | else | 272 | else | ||
280 | error(sprintf('config file syntax error')) | 273 | error(sprintf('config file syntax error')) | ||
281 | end | 274 | end | ||
282 | 275 | ||||
283 | % board parameters | 276 | % board parameters | ||
284 | param.C_0 = xls_parameter(parameter, 'C_0', true,0)*1e-9; % If Include PCB is set to 1, near device single ended capacitance C0 in nF is added | 277 | param.C_0 = xls_parameter(parameter, 'C_0', true,0)*1e-9; % If Include PCB is set to 1, near device single ended capacitance C0 in nF is added | ||
285 | param.C_1 = xls_parameter(parameter, 'C_1', true,0)*1e-9; % if Include PCB is set to 1, connector side single ended capacitance C1 in nF is added | 278 | param.C_1 = xls_parameter(parameter, 'C_1', true,0)*1e-9; % if Include PCB is set to 1, connector side single ended capacitance C1 in nF is added | ||
≠ | 286 | % added default to support multiple packages | ≠ | 279 | % |
≠ | 287 | param.z_p_next_cases = xls_parameter(parameter, 'z_p (NEXT)', true,'[ 8 24 30 45 ; 1 1 1 1; 1 1 1 1 ; 0.5 0.5 0.5 0.5 ]').'; % List of NEXT transmitter package trace lengths in mm, one per case | ≠ | 280 | param.z_p_next_cases = xls_parameter(parameter, 'z_p (NEXT)', true).'; % List of NEXT transmitter package trace lengths in mm, one per case |
288 | [ncases1, mele1]=size(param.z_p_next_cases); | 281 | [ncases1, mele1]=size(param.z_p_next_cases); | ||
289 | if ncases ~= ncases1 || mele ~= mele1 | 282 | if ncases ~= ncases1 || mele ~= mele1 | ||
290 | error('All TX, NEXT, FEXT, Rx cases must agree'); | 283 | error('All TX, NEXT, FEXT, Rx cases must agree'); | ||
291 | else | 284 | else | ||
292 | end | 285 | end | ||
≠ | 293 | param.z_p_fext_cases = xls_parameter(parameter, 'z_p (FEXT)', true,'[ 8 24 30 45 ; 1 1 1 1; 1 1 1 1 ; 0.5 0.5 0.5 0.5 ]').'; % List of FEXT transmitter package trace lengths in mm, one per case | ≠ | 286 | param.z_p_fext_cases = xls_parameter(parameter, 'z_p (FEXT)', true).'; % List of FEXT transmitter package trace lengths in mm, one per case |
294 | [ncases1, mele1]=size(param.z_p_fext_cases); | 287 | [ncases1, mele1]=size(param.z_p_fext_cases); | ||
295 | if ncases ~= ncases1 || mele ~= mele1 | 288 | if ncases ~= ncases1 || mele ~= mele1 | ||
296 | error('All TX, NEXT, FEXT, Rx cases must agree'); | 289 | error('All TX, NEXT, FEXT, Rx cases must agree'); | ||
297 | else | 290 | else | ||
298 | end | 291 | end | ||
≠ | 299 | param.z_p_rx_cases = xls_parameter(parameter, 'z_p (RX)', true,'[ 8 24 30 45 ; 1 1 1 1; 1 1 1 1 ; 0.5 0.5 0.5 0.5 ]').'; % List of FEXT receiver package trace lengths in mm, one per case | ≠ | 292 | param.z_p_rx_cases = xls_parameter(parameter, 'z_p (RX)', true).'; % List of FEXT receiver package trace lengths in mm, one per case |
300 | [ncases1, mele1]=size(param.z_p_rx_cases); | 293 | [ncases1, mele1]=size(param.z_p_rx_cases); | ||
301 | if ncases ~= ncases1 || mele ~= mele1 | 294 | if ncases ~= ncases1 || mele ~= mele1 | ||
302 | error('All TX, NEXT, FEXT, Rx cases must agree'); | 295 | error('All TX, NEXT, FEXT, Rx cases must agree'); | ||
303 | else | 296 | else | ||
304 | end | 297 | end | ||
305 | % Table 93A-3 parameters | 298 | % Table 93A-3 parameters | ||
306 | param.pkg_gamma0_a1_a2 = xls_parameter(parameter, 'package_tl_gamma0_a1_a2', true, [0 1.734e-3 1.455e-4]); %Fitting parameters for package model per unit length. First element is in 1/mm and affects DC loss of package model . Second element is in ns1/2/mm and affects loss proportional to sqrt(f). Third element is in ns/mm and affects loss proportional to f. | 299 | param.pkg_gamma0_a1_a2 = xls_parameter(parameter, 'package_tl_gamma0_a1_a2', true, [0 1.734e-3 1.455e-4]); %Fitting parameters for package model per unit length. First element is in 1/mm and affects DC loss of package model . Second element is in ns1/2/mm and affects loss proportional to sqrt(f). Third element is in ns/mm and affects loss proportional to f. | ||
307 | param.pkg_tau = xls_parameter(parameter, 'package_tl_tau', true, 6.141e-3); % Package model transmission line delay ns/mm | 300 | param.pkg_tau = xls_parameter(parameter, 'package_tl_tau', true, 6.141e-3); % Package model transmission line delay ns/mm | ||
≠ | 308 | param.pkg_Z_c = xls_parameter(parameter, 'package_Z_c', true, '[92 92 ; 70 70; 80 80; 100 100]').';% Package model transmission line characteristic impedance [ Tx , Rx ] | ≠ | 301 | param.pkg_Z_c = xls_parameter(parameter, 'package_Z_c', true, 78.2).';% Package model transmission line characteristic impedance [ Tx , Rx ] |
309 | [ ncases1, mele1]=size(param.pkg_Z_c);% | 302 | [ ncases1, mele1]=size(param.pkg_Z_c);% | ||
310 | if mele ~= mele1 | 303 | if mele ~= mele1 | ||
311 | error('tx rx pairs must have thesame number element entries as TX, NEXT, FEXT, Rx'); | 304 | error('tx rx pairs must have thesame number element entries as TX, NEXT, FEXT, Rx'); | ||
312 | else | 305 | else | ||
313 | end | 306 | end | ||
314 | if mele1==2 % fuill in a array if only a 2 element flex package is specified | 307 | if mele1==2 % fuill in a array if only a 2 element flex package is specified | ||
315 | for ii=1:ncases | 308 | for ii=1:ncases | ||
316 | param.z_p_fext_casesx(ii,:)= [param.z_p_fext_cases(ii,:)' ;[ 0 ; 0 ]]'; | 309 | param.z_p_fext_casesx(ii,:)= [param.z_p_fext_cases(ii,:)' ;[ 0 ; 0 ]]'; | ||
317 | param.z_p_next_casesx(ii,:)= [param.z_p_next_cases(ii,:)' ;[ 0 ; 0 ]]'; | 310 | param.z_p_next_casesx(ii,:)= [param.z_p_next_cases(ii,:)' ;[ 0 ; 0 ]]'; | ||
318 | param.z_p_tx_casesx(ii,:)= [param.z_p_tx_cases(ii,:)' ;[ 0 ; 0 ]]'; | 311 | param.z_p_tx_casesx(ii,:)= [param.z_p_tx_cases(ii,:)' ;[ 0 ; 0 ]]'; | ||
319 | param.z_p_rx_casesx(ii,:)= [param.z_p_rx_cases(ii,:)' ;[ 0 ; 0 ]]'; | 312 | param.z_p_rx_casesx(ii,:)= [param.z_p_rx_cases(ii,:)' ;[ 0 ; 0 ]]'; | ||
320 | end | 313 | end | ||
321 | param.z_p_fext_cases = param.z_p_fext_casesx; | 314 | param.z_p_fext_cases = param.z_p_fext_casesx; | ||
322 | param.z_p_next_cases= param.z_p_next_casesx; | 315 | param.z_p_next_cases= param.z_p_next_casesx; | ||
323 | param.z_p_tx_cases= param.z_p_tx_casesx; | 316 | param.z_p_tx_cases= param.z_p_tx_casesx; | ||
324 | param.z_p_rx_cases= param.z_p_rx_casesx; | 317 | param.z_p_rx_cases= param.z_p_rx_casesx; | ||
325 | param.pkg_Z_c=[param.pkg_Z_c' ;[ 100 100 ; 100 100 ]]'; | 318 | param.pkg_Z_c=[param.pkg_Z_c' ;[ 100 100 ; 100 100 ]]'; | ||
326 | end | 319 | end | ||
327 | param.PKG_Tx_FFE_preset =xls_parameter(parameter, 'PKG_Tx_FFE_preset', true, 0); % RIM 08-18-2022 for Tx preset capability | 320 | param.PKG_Tx_FFE_preset =xls_parameter(parameter, 'PKG_Tx_FFE_preset', true, 0); % RIM 08-18-2022 for Tx preset capability | ||
328 | 321 | ||||
329 | % Table 92-12 parameters | 322 | % Table 92-12 parameters | ||
330 | param.brd_gamma0_a1_a2 = xls_parameter(parameter, 'board_tl_gamma0_a1_a2', true, [0 4.114e-4 2.547e-4]); % Fitting parameters for package model per unit length. First element is in 1/mm and affects DC loss of package model . Second element is in ns1/2/mm and affects loss proportional to sqrt(f). Third element is in ns/mm and affects loss proportional to f. | 323 | param.brd_gamma0_a1_a2 = xls_parameter(parameter, 'board_tl_gamma0_a1_a2', true, [0 4.114e-4 2.547e-4]); % Fitting parameters for package model per unit length. First element is in 1/mm and affects DC loss of package model . Second element is in ns1/2/mm and affects loss proportional to sqrt(f). Third element is in ns/mm and affects loss proportional to f. | ||
331 | param.brd_tau = xls_parameter(parameter, 'board_tl_tau', true, 6.191e-3);% Board model transmission line delay ns/mm | 324 | param.brd_tau = xls_parameter(parameter, 'board_tl_tau', true, 6.191e-3);% Board model transmission line delay ns/mm | ||
332 | param.brd_Z_c = xls_parameter(parameter, 'board_Z_c', true, 109.8); % Board model transmission line characteristic impedance [ Tx , Rx ] | 325 | param.brd_Z_c = xls_parameter(parameter, 'board_Z_c', true, 109.8); % Board model transmission line characteristic impedance [ Tx , Rx ] | ||
333 | param.z_bp_tx = xls_parameter(parameter, 'z_bp (TX)', true, 151); % Victim transmitter board trace lengths in mm | 326 | param.z_bp_tx = xls_parameter(parameter, 'z_bp (TX)', true, 151); % Victim transmitter board trace lengths in mm | ||
334 | param.z_bp_next = xls_parameter(parameter, 'z_bp (NEXT)', true, 72);% Next Assessor transmitter board trace lengths in mm | 327 | param.z_bp_next = xls_parameter(parameter, 'z_bp (NEXT)', true, 72);% Next Assessor transmitter board trace lengths in mm | ||
335 | param.z_bp_fext = xls_parameter(parameter, 'z_bp (FEXT)', true, 72);% Rext Assessor transmitter board trace lengths in mm | 328 | param.z_bp_fext = xls_parameter(parameter, 'z_bp (FEXT)', true, 72);% Rext Assessor transmitter board trace lengths in mm | ||
336 | param.z_bp_rx = xls_parameter(parameter, 'z_bp (RX)', true, 151);% Victim receiver board trace lengths in mm | 329 | param.z_bp_rx = xls_parameter(parameter, 'z_bp (RX)', true, 151);% Victim receiver board trace lengths in mm | ||
337 | 330 | ||||
338 | % Unofficial parameters | 331 | % Unofficial parameters | ||
339 | param.snpPortsOrder = xls_parameter(parameter, 'Port Order', true, [1 3 2 4]); % s parameter port order [ tx+ tx- rx+ rx-] | 332 | param.snpPortsOrder = xls_parameter(parameter, 'Port Order', true, [1 3 2 4]); % s parameter port order [ tx+ tx- rx+ rx-] | ||
340 | param.delta_IL=xls_parameter(parameter, 'delta_IL', false, 1); % experiemnal | 333 | param.delta_IL=xls_parameter(parameter, 'delta_IL', false, 1); % experiemnal | ||
341 | % Deprecated parameters - affect only frequency domain analysis. | 334 | % Deprecated parameters - affect only frequency domain analysis. | ||
342 | param.f_v = xls_parameter(parameter, 'f_v', true, 4); % For FOM_ILD: Transiton rate cut off frequency for ICN/ILD calc in terms of fb | 335 | param.f_v = xls_parameter(parameter, 'f_v', true, 4); % For FOM_ILD: Transiton rate cut off frequency for ICN/ILD calc in terms of fb | ||
343 | param.f_f = xls_parameter(parameter, 'f_f', true, 4); % For ICN: Fext transiton rate cut off frequency for ICN calc in terms of fb | 336 | param.f_f = xls_parameter(parameter, 'f_f', true, 4); % For ICN: Fext transiton rate cut off frequency for ICN calc in terms of fb | ||
344 | param.f_n = xls_parameter(parameter, 'f_n', true, 4); % For ICN: Next transiton rate cut off frequency for ICN calc in terms of fb | 337 | param.f_n = xls_parameter(parameter, 'f_n', true, 4); % For ICN: Next transiton rate cut off frequency for ICN calc in terms of fb | ||
345 | param.f_r = xls_parameter(parameter, 'f_r', true, 4); % reference receive filter in COM and in ICN/FOM_ILD calcs in terms of fb | 338 | param.f_r = xls_parameter(parameter, 'f_r', true, 4); % reference receive filter in COM and in ICN/FOM_ILD calcs in terms of fb | ||
346 | param.fb_BT_cutoff= xls_parameter(parameter, 'TDR_f_BT_3db', true, 0.4730); % Bessel-Thomson 3 dB cut off freqeuncy in terms of fb | 339 | param.fb_BT_cutoff= xls_parameter(parameter, 'TDR_f_BT_3db', true, 0.4730); % Bessel-Thomson 3 dB cut off freqeuncy in terms of fb | ||
347 | param.BTorder = xls_parameter(parameter, 'BTorder', false, 4); % Bessel function order | 340 | param.BTorder = xls_parameter(parameter, 'BTorder', false, 4); % Bessel function order | ||
348 | param.RC_Start = xls_parameter(parameter, 'RC_Start', false, param.fb/2); % start frequency for raised cosine filter | 341 | param.RC_Start = xls_parameter(parameter, 'RC_Start', false, param.fb/2); % start frequency for raised cosine filter | ||
349 | param.RC_end = xls_parameter(parameter, 'RC_end', false, param.fb*param.f_r ); % end frequency for raised cosine filter | 342 | param.RC_end = xls_parameter(parameter, 'RC_end', false, param.fb*param.f_r ); % end frequency for raised cosine filter | ||
350 | param.beta_x= xls_parameter(parameter, 'beta_x', false, 0);% (for ERL) use default | 343 | param.beta_x= xls_parameter(parameter, 'beta_x', false, 0);% (for ERL) use default | ||
351 | param.rho_x= xls_parameter(parameter, 'rho_x', false, .618); % (for ERL) use default | 344 | param.rho_x= xls_parameter(parameter, 'rho_x', false, .618); % (for ERL) use default | ||
352 | param.tfx= xls_parameter(parameter, 'fixture delay time', true, -1);% fixture delay time (for ERL) | 345 | param.tfx= xls_parameter(parameter, 'fixture delay time', true, -1);% fixture delay time (for ERL) | ||
353 | param.Grr_limit=xls_parameter(parameter, 'Grr_limit', false, 1); % either do no use or set to 1 (for ERL) | 346 | param.Grr_limit=xls_parameter(parameter, 'Grr_limit', false, 1); % either do no use or set to 1 (for ERL) | ||
354 | param.Grr=xls_parameter(parameter, 'Grr', false, param.Grr_limit);% either do no use or set to 1 (for ERL) | 347 | param.Grr=xls_parameter(parameter, 'Grr', false, param.Grr_limit);% either do no use or set to 1 (for ERL) | ||
355 | param.Gx=xls_parameter(parameter, 'Gx', false, 0); % ERL parameter param.Grr, This is used is the COM code | 348 | param.Gx=xls_parameter(parameter, 'Gx', false, 0); % ERL parameter param.Grr, This is used is the COM code | ||
356 | switch param.Gx | 349 | switch param.Gx | ||
357 | case 0 | 350 | case 0 | ||
358 | param.Grr=param.Grr; % just use older Grr ir gx not specified | 351 | param.Grr=param.Grr; % just use older Grr ir gx not specified | ||
359 | case 1 | 352 | case 1 | ||
360 | param.Grr=2; % use newer Grr | 353 | param.Grr=2; % use newer Grr | ||
361 | end | 354 | end | ||
362 | 355 | ||||
363 | param.LOCAL_SEARCH=xls_parameter(parameter,'Local Search',true,0); % Decreases COM compute time. Aetting to 2 seems ok ,if 0 search is full grid | 356 | param.LOCAL_SEARCH=xls_parameter(parameter,'Local Search',true,0); % Decreases COM compute time. Aetting to 2 seems ok ,if 0 search is full grid | ||
364 | % Operational control variables | 357 | % Operational control variables | ||
365 | %OP.include_pcb = xls_parameter(parameter, 'Include PCB (table 92-13)', false, 0); | 358 | %OP.include_pcb = xls_parameter(parameter, 'Include PCB (table 92-13)', false, 0); | ||
366 | param.Tukey_Window=xls_parameter(parameter,'Tukey_Window',true,0); % required for ERL. Set to 1. Default is 0. | 359 | param.Tukey_Window=xls_parameter(parameter,'Tukey_Window',true,0); % required for ERL. Set to 1. Default is 0. | ||
367 | param.Noise_Crest_Factor= xls_parameter(parameter, 'Noise_Crest_Factor', true, 0); % Normally not used. If set this is q factor used for quantized Gaussian PDFs | 360 | param.Noise_Crest_Factor= xls_parameter(parameter, 'Noise_Crest_Factor', true, 0); % Normally not used. If set this is q factor used for quantized Gaussian PDFs | ||
368 | param.AC_CM_RMS = xls_parameter(parameter, 'AC_CM_RMS', true, 0); % AC_CM_RMS is the CM BBN AWGN RMS at COM source point. Default is 0. Adds common mode noise source to the COM signal path for the through channel | 361 | param.AC_CM_RMS = xls_parameter(parameter, 'AC_CM_RMS', true, 0); % AC_CM_RMS is the CM BBN AWGN RMS at COM source point. Default is 0. Adds common mode noise source to the COM signal path for the through channel | ||
369 | param.ACCM_MAX_Freq=xls_parameter(parameter, 'ACCM_MAX_Freq', true, param.fb); % F max for integrating ACCM voltage in Hz. Default is fb | 362 | param.ACCM_MAX_Freq=xls_parameter(parameter, 'ACCM_MAX_Freq', true, param.fb); % F max for integrating ACCM voltage in Hz. Default is fb | ||
370 | param.T_O = xls_parameter(parameter, 'T_O', true, 0 ); % Units are mUI. Histogram for VEC and VEO are computed over T_s +/- T_O. | 363 | param.T_O = xls_parameter(parameter, 'T_O', true, 0 ); % Units are mUI. Histogram for VEC and VEO are computed over T_s +/- T_O. | ||
371 | param.T_O = xls_parameter(parameter, 'T_h', true, param.T_O ); % superceded with T_O but is the internal values that is used. Do not use. | 364 | param.T_O = xls_parameter(parameter, 'T_h', true, param.T_O ); % superceded with T_O but is the internal values that is used. Do not use. | ||
372 | 365 | ||||
373 | param.samples_for_C2M =xls_parameter(parameter, 'samples_for_C2M', true, 100 ); % Finer sampling in terms of samples per UI for c2m histgram analysis. | 366 | param.samples_for_C2M =xls_parameter(parameter, 'samples_for_C2M', true, 100 ); % Finer sampling in terms of samples per UI for c2m histgram analysis. | ||
374 | 367 | ||||
375 | OP.Histogram_Window_Weight=xls_parameter(parameter, 'Histogram_Window_Weight', false, 'rectangle' ); %Weighting for VEC and VEO are histogram processing. Type are Gaussian,Dual Rayleigh,Triangle, and Rectangle (default) | 368 | OP.Histogram_Window_Weight=xls_parameter(parameter, 'Histogram_Window_Weight', false, 'rectangle' ); %Weighting for VEC and VEO are histogram processing. Type are Gaussian,Dual Rayleigh,Triangle, and Rectangle (default) | ||
376 | param.sigma_r=xls_parameter(parameter, 'sigma_r', true, .020 ); % sigma_r for 0.3ck Gaussian histogram window. Unit are UI. Preferred usage. | 369 | param.sigma_r=xls_parameter(parameter, 'sigma_r', true, .020 ); % sigma_r for 0.3ck Gaussian histogram window. Unit are UI. Preferred usage. | ||
377 | param.Qr=xls_parameter(parameter, 'Qr', true, param.sigma_r ); % sigma_r replaces Qr gasussian histogram window. Unit are UI | 370 | param.Qr=xls_parameter(parameter, 'Qr', true, param.sigma_r ); % sigma_r replaces Qr gasussian histogram window. Unit are UI | ||
378 | param.QL=xls_parameter(parameter, 'QL', true, param.T_O/param.Qr/1000 ); % superceded with sigma_r but is the internal values that is used | 371 | param.QL=xls_parameter(parameter, 'QL', true, param.T_O/param.Qr/1000 ); % superceded with sigma_r but is the internal values that is used | ||
379 | 372 | ||||
380 | %% | 373 | %% | ||
381 | 374 | ||||
382 | param.skew_ps=xls_parameter(parameter, 'skew_ps', true, 0 );% experiment p/n skew. Not used. | 375 | param.skew_ps=xls_parameter(parameter, 'skew_ps', true, 0 );% experiment p/n skew. Not used. | ||
383 | param.imb_Z_fctr=xls_parameter(parameter, 'imb_Z_fctr', true, 1 ); % exprimental p/n impedance missmatch. Not used. | 376 | param.imb_Z_fctr=xls_parameter(parameter, 'imb_Z_fctr', true, 1 ); % exprimental p/n impedance missmatch. Not used. | ||
384 | param.imb_C_fctr=xls_parameter(parameter, 'imb_C_fctr', true, 1 ); % exprimental p/n capacitance missmatch. Not used. | 377 | param.imb_C_fctr=xls_parameter(parameter, 'imb_C_fctr', true, 1 ); % exprimental p/n capacitance missmatch. Not used. | ||
385 | param.awgn_mv=param.AC_CM_RMS; | 378 | param.awgn_mv=param.AC_CM_RMS; | ||
386 | param.flip=xls_parameter(parameter, 'flip', true, 0 ); % exprimental p/n missmatch flip. Not used. | 379 | param.flip=xls_parameter(parameter, 'flip', true, 0 ); % exprimental p/n missmatch flip. Not used. | ||
387 | param.f_hp=xls_parameter(parameter, 'f_hp', true, 0 ); % for rx testing for eq 162-12 if 0 (default) then rx test using rx bbn | 380 | param.f_hp=xls_parameter(parameter, 'f_hp', true, 0 ); % for rx testing for eq 162-12 if 0 (default) then rx test using rx bbn | ||
388 | param.Q=xls_parameter(parameter, 'Q', true, 0 ); % Implementation penalty for MLSE in EQ 178a-36 | 381 | param.Q=xls_parameter(parameter, 'Q', true, 0 ); % Implementation penalty for MLSE in EQ 178a-36 | ||
389 | 382 | ||||
390 | %% Adding new parameters to reveal whether Floating DFE or Floating RXFFE is used | 383 | %% Adding new parameters to reveal whether Floating DFE or Floating RXFFE is used | ||
391 | % This removes the dependency on checking param.N_bg (that is no longer valid to reveal if floating DFE is used) | 384 | % This removes the dependency on checking param.N_bg (that is no longer valid to reveal if floating DFE is used) | ||
392 | param.Floating_RXFFE=false; | 385 | param.Floating_RXFFE=false; | ||
393 | param.Floating_DFE=false; | 386 | param.Floating_DFE=false; | ||
394 | if param.N_bg > 0 | 387 | if param.N_bg > 0 | ||
395 | param.Floating_DFE=true; | 388 | param.Floating_DFE=true; | ||
396 | end | 389 | end | ||
397 | if OP.RxFFE | 390 | if OP.RxFFE | ||
398 | param.Floating_DFE=false; | 391 | param.Floating_DFE=false; | ||
399 | if param.N_bg > 0 | 392 | if param.N_bg > 0 | ||
400 | param.Floating_RXFFE=true; | 393 | param.Floating_RXFFE=true; | ||
401 | end | 394 | end | ||
402 | end | 395 | end | ||
403 | %% for introducing Tx or Rx skew on p leg or n leg | 396 | %% for introducing Tx or Rx skew on p leg or n leg | ||
404 | param.Txpskew=xls_parameter(parameter, 'Txpskew', true, 0 ); % Tx p skew in ps | 397 | param.Txpskew=xls_parameter(parameter, 'Txpskew', true, 0 ); % Tx p skew in ps | ||
405 | param.Txnskew=xls_parameter(parameter, 'Txnskew', true, 0 ); % Tx n skew in ps | 398 | param.Txnskew=xls_parameter(parameter, 'Txnskew', true, 0 ); % Tx n skew in ps | ||
406 | param.Rxpskew=xls_parameter(parameter, 'Rxpskew', true, 0 ); % Rx p skew in ps | 399 | param.Rxpskew=xls_parameter(parameter, 'Rxpskew', true, 0 ); % Rx p skew in ps | ||
407 | param.Rxnskew=xls_parameter(parameter, 'Rxnskew', true, 0 ); % Rx n skew in ps | 400 | param.Rxnskew=xls_parameter(parameter, 'Rxnskew', true, 0 ); % Rx n skew in ps | ||
408 | 401 | ||||
409 | %% | 402 | %% | ||
410 | OP.include_pcb = xls_parameter(parameter, 'Include PCB', false); % Used to add a PCB one each side of the passed s-parameters. | 403 | OP.include_pcb = xls_parameter(parameter, 'Include PCB', false); % Used to add a PCB one each side of the passed s-parameters. | ||
411 | OP.exit_if_deployed = xls_parameter(parameter, 'exit if deployed', false,0); % may need set when COM is an exe | 404 | OP.exit_if_deployed = xls_parameter(parameter, 'exit if deployed', false,0); % may need set when COM is an exe | ||
412 | OP.INCLUDE_CTLE = xls_parameter(parameter, 'INCLUDE_CTLE', false, 1); % do not use | 405 | OP.INCLUDE_CTLE = xls_parameter(parameter, 'INCLUDE_CTLE', false, 1); % do not use | ||
413 | OP.EXE_MODE= xls_parameter(parameter, 'EXE_MODE', false, 1);% 12/21 0:legacy 1:fast 2:superfast default is 1. | 406 | OP.EXE_MODE= xls_parameter(parameter, 'EXE_MODE', false, 1);% 12/21 0:legacy 1:fast 2:superfast default is 1. | ||
414 | OP.INCLUDE_FILTER = xls_parameter(parameter, 'INCLUDE_TX_RX_FILTER', false, 1); % do not use | 407 | OP.INCLUDE_FILTER = xls_parameter(parameter, 'INCLUDE_TX_RX_FILTER', false, 1); % do not use | ||
415 | OP.force_pdf_bin_size = xls_parameter(parameter, 'Force PDF bin size', false, 0); % do not use | 408 | OP.force_pdf_bin_size = xls_parameter(parameter, 'Force PDF bin size', false, 0); % do not use | ||
416 | OP.BinSize = xls_parameter(parameter, 'PDF bin size', false, 1e-5); % set lower for faster computation time but less accuracy. | 409 | OP.BinSize = xls_parameter(parameter, 'PDF bin size', false, 1e-5); % set lower for faster computation time but less accuracy. | ||
417 | OP.DEBUG = xls_parameter(parameter, 'DIAGNOSTICS', false, false); % supresss some interim compuation value printouts | 410 | OP.DEBUG = xls_parameter(parameter, 'DIAGNOSTICS', false, false); % supresss some interim compuation value printouts | ||
418 | OP.DISPLAY_WINDOW = xls_parameter(parameter, 'DISPLAY_WINDOW', false, true); % controls if graph plots are displayed. Typically goes along with DIAGNOSTICS | 411 | OP.DISPLAY_WINDOW = xls_parameter(parameter, 'DISPLAY_WINDOW', false, true); % controls if graph plots are displayed. Typically goes along with DIAGNOSTICS | ||
419 | OP.CSV_REPORT = xls_parameter(parameter, 'CSV_REPORT', false, true); % saves all the output parameters to a CSV file in the results directory, If DIAGNOSTICS is set then a mat file is also created | 412 | OP.CSV_REPORT = xls_parameter(parameter, 'CSV_REPORT', false, true); % saves all the output parameters to a CSV file in the results directory, If DIAGNOSTICS is set then a mat file is also created | ||
420 | OP.SAVE_TD=xls_parameter(parameter, 'SAVE_TD', false, false); % Save the time domian waveforms. FIR, PR etc. in an output structure | 413 | OP.SAVE_TD=xls_parameter(parameter, 'SAVE_TD', false, false); % Save the time domian waveforms. FIR, PR etc. in an output structure | ||
421 | OP.SAVE_FIGURES=xls_parameter(parameter, 'SAVE_FIGURES', false, false); % save displayed figures in the results directory | 414 | OP.SAVE_FIGURES=xls_parameter(parameter, 'SAVE_FIGURES', false, false); % save displayed figures in the results directory | ||
422 | OP.SAVE_FIGURE_to_CSV=xls_parameter(parameter, 'SAVE_FIGURE_to_CSV', false, false); % does not work. do not use. | 415 | OP.SAVE_FIGURE_to_CSV=xls_parameter(parameter, 'SAVE_FIGURE_to_CSV', false, false); % does not work. do not use. | ||
423 | OP.GET_FD = xls_parameter(parameter, 'Display frequency domain', false, OP.GET_FD); % Not normally set in the config file. It is normally just set to true to get FD plots | 416 | OP.GET_FD = xls_parameter(parameter, 'Display frequency domain', false, OP.GET_FD); % Not normally set in the config file. It is normally just set to true to get FD plots | ||
424 | OP.INC_PACKAGE = xls_parameter(parameter, 'INC_PACKAGE', false, true); % warning: INC_PACKAGE=0 not fully supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 | 417 | OP.INC_PACKAGE = xls_parameter(parameter, 'INC_PACKAGE', false, true); % warning: INC_PACKAGE=0 not fully supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 | ||
425 | if ~OP.INC_PACKAGE | 418 | if ~OP.INC_PACKAGE | ||
426 | fprintf('<strong> Warning!!! INC_PACKAGE=0 not fully supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 </strong>\n'); | 419 | fprintf('<strong> Warning!!! INC_PACKAGE=0 not fully supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 </strong>\n'); | ||
427 | end | 420 | end | ||
428 | 421 | ||||
429 | OP.EW = xls_parameter(parameter, 'EW', false, false); % RIM 3-18-2021 change defaults | 422 | OP.EW = xls_parameter(parameter, 'EW', false, false); % RIM 3-18-2021 change defaults | ||
430 | OP.IDEAL_TX_TERM = xls_parameter(parameter, 'IDEAL_TX_TERM', false, false); | 423 | OP.IDEAL_TX_TERM = xls_parameter(parameter, 'IDEAL_TX_TERM', false, false); | ||
431 | if OP.IDEAL_TX_TERM | 424 | if OP.IDEAL_TX_TERM | ||
432 | fprintf('<strong> Warning!!! IDEAL_TX_TERM not supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 </strong>\n'); | 425 | fprintf('<strong> Warning!!! IDEAL_TX_TERM not supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 </strong>\n'); | ||
433 | end | 426 | end | ||
434 | OP.IDEAL_RX_TERM = xls_parameter(parameter, 'IDEAL_RX_TERM', false, false); | 427 | OP.IDEAL_RX_TERM = xls_parameter(parameter, 'IDEAL_RX_TERM', false, false); | ||
435 | if OP.IDEAL_RX_TERM | 428 | if OP.IDEAL_RX_TERM | ||
436 | fprintf('<strong> Warning!!! IDEAL_RX_TERM not supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 </strong>\n'); | 429 | fprintf('<strong> Warning!!! IDEAL_RX_TERM not supported, instead, set Zp,Cd, and Cp parameters to zero and Zp select to 1 </strong>\n'); | ||
437 | end | 430 | end | ||
438 | 431 | ||||
439 | OP.TDMODE = xls_parameter(parameter, 'TDMODE',false, OP.TDMODE); % Enables the the use of pulse response instead of s-parameters. Assumes no packages or the packages are included in the PR. Default is 0. | 432 | OP.TDMODE = xls_parameter(parameter, 'TDMODE',false, OP.TDMODE); % Enables the the use of pulse response instead of s-parameters. Assumes no packages or the packages are included in the PR. Default is 0. | ||
440 | 433 | ||||
441 | OP.FT_COOP = xls_parameter(parameter, 'FT_COOP',false, false); % obsolete do not use. | 434 | OP.FT_COOP = xls_parameter(parameter, 'FT_COOP',false, false); % obsolete do not use. | ||
442 | OP.RESULT_DIR = regexprep(xls_parameter(parameter, 'RESULT_DIR'), '\\', filesep); % directory where results like csv, mat, and/or figure files will be written | 435 | OP.RESULT_DIR = regexprep(xls_parameter(parameter, 'RESULT_DIR'), '\\', filesep); % directory where results like csv, mat, and/or figure files will be written | ||
443 | OP.RESULT_DIR=strrep(OP.RESULT_DIR,'{date}',date); | 436 | OP.RESULT_DIR=strrep(OP.RESULT_DIR,'{date}',date); | ||
444 | OP.BREAD_CRUMBS = xls_parameter(parameter, 'BREAD_CRUMBS',false, false); % if DIAGNOSTICS is set then param, OP, and chdata are include in the output for each run | 437 | OP.BREAD_CRUMBS = xls_parameter(parameter, 'BREAD_CRUMBS',false, false); % if DIAGNOSTICS is set then param, OP, and chdata are include in the output for each run | ||
445 | OP.BREAD_CRUMBS_FIELDS = xls_parameter(parameter, 'BREAD_CRUMBS_FIELDS',false, ''); % if BREAD_CRUMBs is enabled, this file controls what chdata fields are included | 438 | OP.BREAD_CRUMBS_FIELDS = xls_parameter(parameter, 'BREAD_CRUMBS_FIELDS',false, ''); % if BREAD_CRUMBs is enabled, this file controls what chdata fields are included | ||
446 | OP.COM_CONTRIBUTION_CURVES = xls_parameter(parameter, 'COM_CONTRIBUTION',false,0); % Default is 0. If set to 1 then a bar graph of COM contributors is produce instead of bathtub curves | 439 | OP.COM_CONTRIBUTION_CURVES = xls_parameter(parameter, 'COM_CONTRIBUTION',false,0); % Default is 0. If set to 1 then a bar graph of COM contributors is produce instead of bathtub curves | ||
447 | OP.ENFORCE_CAUSALITY = xls_parameter(parameter, 'Enforce Causality', false, 0);% default is 0. Not recommended | 440 | OP.ENFORCE_CAUSALITY = xls_parameter(parameter, 'Enforce Causality', false, 0);% default is 0. Not recommended | ||
448 | OP.EC_REL_TOL = xls_parameter(parameter, 'Enforce Causality REL_TOL', false, 1e-2); % Relative Tolerance parameter for causality, Hard enforcement, 1e-3, Soft enforcement, 1e-2 | 441 | OP.EC_REL_TOL = xls_parameter(parameter, 'Enforce Causality REL_TOL', false, 1e-2); % Relative Tolerance parameter for causality, Hard enforcement, 1e-3, Soft enforcement, 1e-2 | ||
449 | OP.EC_DIFF_TOL = xls_parameter(parameter, 'Enforce Causality DIFF_TOL', false, 1e-3); % Difference Tolerance parameter for causality, Hard enforcement, 1e-4,Soft enforcement, 1e-3 | 442 | OP.EC_DIFF_TOL = xls_parameter(parameter, 'Enforce Causality DIFF_TOL', false, 1e-3); % Difference Tolerance parameter for causality, Hard enforcement, 1e-4,Soft enforcement, 1e-3 | ||
450 | OP.EC_PULSE_TOL = xls_parameter(parameter, 'Enforce Causality pulse start tolerance', false, 0.01); % Tolerance parameter for causality, Hard enforcement, 0.05, Soft enforcement, .01 | 443 | OP.EC_PULSE_TOL = xls_parameter(parameter, 'Enforce Causality pulse start tolerance', false, 0.01); % Tolerance parameter for causality, Hard enforcement, 0.05, Soft enforcement, .01 | ||
451 | OP.pkg_len_select = xls_parameter(parameter, 'z_p select', true, 1); % List of package length indexes used to run COM | 444 | OP.pkg_len_select = xls_parameter(parameter, 'z_p select', true, 1); % List of package length indexes used to run COM | ||
452 | OP.RX_CALIBRATION = xls_parameter(parameter, 'RX_CALIBRATION', false, false); % Turn on RX_Calibration loop | 445 | OP.RX_CALIBRATION = xls_parameter(parameter, 'RX_CALIBRATION', false, false); % Turn on RX_Calibration loop | ||
453 | OP.sigma_bn_STEP = xls_parameter(parameter, 'Sigma BBN step', false, 5e-3); % BBN step for Rx Calibration in volts. Defaults is 0.5e-3 | 446 | OP.sigma_bn_STEP = xls_parameter(parameter, 'Sigma BBN step', false, 5e-3); % BBN step for Rx Calibration in volts. Defaults is 0.5e-3 | ||
454 | OP.BBN_Q_factor = xls_parameter(parameter, 'BBN Q factor', false, 5); % Overrides NEXT/FEXT noise Qfactor for 'Force BBN Q factor' used for reporting. does not affect COM. | 447 | OP.BBN_Q_factor = xls_parameter(parameter, 'BBN Q factor', false, 5); % Overrides NEXT/FEXT noise Qfactor for 'Force BBN Q factor' used for reporting. does not affect COM. | ||
455 | OP.force_BBN_Q_factor = xls_parameter(parameter, 'Force BBN Q factor', false, false); % Used for reporting and bathtub curves. does not affect COM. | 448 | OP.force_BBN_Q_factor = xls_parameter(parameter, 'Force BBN Q factor', false, false); % Used for reporting and bathtub curves. does not affect COM. | ||
456 | OP.transmitter_transition_time = xls_parameter(parameter, 'T_r', true , 8e-3); % 20% to 80% transition time used for the Gaussian shaped source | 449 | OP.transmitter_transition_time = xls_parameter(parameter, 'T_r', true , 8e-3); % 20% to 80% transition time used for the Gaussian shaped source | ||
457 | OP.RL_norm_test=xls_parameter(parameter, 'ERL_FOM', false, 1); % Defaults to 1 indicating variance is used for FOM determination. Do not change. | 450 | OP.RL_norm_test=xls_parameter(parameter, 'ERL_FOM', false, 1); % Defaults to 1 indicating variance is used for FOM determination. Do not change. | ||
458 | 451 | ||||
459 | OP.T_r_meas_point = xls_parameter(parameter, 'T_r_meas_point', false, 0); % included for earlier version support. Not recommended to use. | 452 | OP.T_r_meas_point = xls_parameter(parameter, 'T_r_meas_point', false, 0); % included for earlier version support. Not recommended to use. | ||
460 | OP.T_r_filter_type= xls_parameter(parameter, 'T_r_filter_type', false, 0);% included for earlier version support. Not recommended to use. | 453 | OP.T_r_filter_type= xls_parameter(parameter, 'T_r_filter_type', false, 0);% included for earlier version support. Not recommended to use. | ||
461 | OP.FORCE_TR = xls_parameter(parameter, 'FORCE_TR', false, false);% Included for earlier version support but should be set to 1 in most later config sheets. | 454 | OP.FORCE_TR = xls_parameter(parameter, 'FORCE_TR', false, false);% Included for earlier version support but should be set to 1 in most later config sheets. | ||
462 | % Control with OP.T_r_filter_type and OP.T_r_meas_point for backward | 455 | % Control with OP.T_r_filter_type and OP.T_r_meas_point for backward | ||
463 | % compatibility | 456 | % compatibility | ||
464 | if OP.FORCE_TR | 457 | if OP.FORCE_TR | ||
465 | OP.T_r_meas_point=0; | 458 | OP.T_r_meas_point=0; | ||
466 | OP.T_r_filter_type=1; | 459 | OP.T_r_filter_type=1; | ||
467 | end | 460 | end | ||
468 | OP.TDR = xls_parameter(parameter, 'TDR', false, false); % Set to 1 to produce TDR results | 461 | OP.TDR = xls_parameter(parameter, 'TDR', false, false); % Set to 1 to produce TDR results | ||
469 | OP.TDR_duration= xls_parameter(parameter, 'TDR_duration', false, 5); % only used if N*UI is longer than the TDR duration time. Default is 5 times the raw s-parameter transit time. | 462 | OP.TDR_duration= xls_parameter(parameter, 'TDR_duration', false, 5); % only used if N*UI is longer than the TDR duration time. Default is 5 times the raw s-parameter transit time. | ||
470 | OP.N = xls_parameter(parameter, 'N', false, 0); % duration time in UI which is used for ERL (PTDR) | 463 | OP.N = xls_parameter(parameter, 'N', false, 0); % duration time in UI which is used for ERL (PTDR) | ||
471 | OP.WC_PORTZ = xls_parameter(parameter, 'WC_PORTZ', false, false); % Do not use: Obsolete. | 464 | OP.WC_PORTZ = xls_parameter(parameter, 'WC_PORTZ', false, false); % Do not use: Obsolete. | ||
472 | OP.T_k= xls_parameter(parameter, 'T_k', false, .6)*1e-9; % Time span (ns) for which the impedance of port is determined using TDR. | 465 | OP.T_k= xls_parameter(parameter, 'T_k', false, .6)*1e-9; % Time span (ns) for which the impedance of port is determined using TDR. | ||
473 | OP.ERL_ONLY = xls_parameter(parameter, 'ERL_ONLY', false,0); % Compute ERL only | 466 | OP.ERL_ONLY = xls_parameter(parameter, 'ERL_ONLY', false,0); % Compute ERL only | ||
474 | OP.ERL=xls_parameter(parameter, 'ERL', false, false); % Enables ERL. Needs TDR to be set as well. | 467 | OP.ERL=xls_parameter(parameter, 'ERL', false, false); % Enables ERL. Needs TDR to be set as well. | ||
475 | if OP.ERL | 468 | if OP.ERL | ||
476 | OP.PTDR=1; | 469 | OP.PTDR=1; | ||
477 | else | 470 | else | ||
478 | OP.PTDR=0; | 471 | OP.PTDR=0; | ||
479 | end % ERL needs to do a TDR | 472 | end % ERL needs to do a TDR | ||
480 | OP.SHOW_BRD= xls_parameter(parameter, 'SHOW_BRD', false,0);% indclude added board (PCB) in TDR and ERL. Default is 0. | 473 | OP.SHOW_BRD= xls_parameter(parameter, 'SHOW_BRD', false,0);% indclude added board (PCB) in TDR and ERL. Default is 0. | ||
481 | if OP.WC_PORTZ , OP.TDR=1;end % Obsolete: WC_PORTZ needs to do a TDR | 474 | if OP.WC_PORTZ , OP.TDR=1;end % Obsolete: WC_PORTZ needs to do a TDR | ||
482 | OP.TDR_W_TXPKG = xls_parameter(parameter, 'TDR_W_TXPKG', false,0);% adds tx package for TDR, PTDR, and ERL. Default is 0. | 475 | OP.TDR_W_TXPKG = xls_parameter(parameter, 'TDR_W_TXPKG', false,0);% adds tx package for TDR, PTDR, and ERL. Default is 0. | ||
483 | OP.Bessel_Thomson=xls_parameter(parameter, 'Bessel_Thomson', false, false); % enable Bessel Thomsen filter for COM | 476 | OP.Bessel_Thomson=xls_parameter(parameter, 'Bessel_Thomson', false, false); % enable Bessel Thomsen filter for COM | ||
484 | OP.TDR_Butterworth=xls_parameter(parameter, 'TDR_Butterworth', false, true); % enable Butterworth filter for TDR, PTDR, and ERL | 477 | OP.TDR_Butterworth=xls_parameter(parameter, 'TDR_Butterworth', false, true); % enable Butterworth filter for TDR, PTDR, and ERL | ||
485 | OP.Butterworth=xls_parameter(parameter, 'Butterworth', false, 1); % Enable Butterworth Rx filter for COM compuatetopm | 478 | OP.Butterworth=xls_parameter(parameter, 'Butterworth', false, 1); % Enable Butterworth Rx filter for COM compuatetopm | ||
486 | OP.Raised_Cosine=xls_parameter(parameter, 'Raised_Cosine', false,0); % Not used if 0. Default is zero. Should set BT and BW to false | 479 | OP.Raised_Cosine=xls_parameter(parameter, 'Raised_Cosine', false,0); % Not used if 0. Default is zero. Should set BT and BW to false | ||
487 | OP.inc_reflect_board=xls_parameter(parameter, 'inc_reflect_board', false,0); % Not used if 0. Default is zero. | 480 | OP.inc_reflect_board=xls_parameter(parameter, 'inc_reflect_board', false,0); % Not used if 0. Default is zero. | ||
488 | OP.AUTO_TFX=xls_parameter(parameter, 'AUTO_TFX', false,0); % Mostly used for device ERL. If sent to 1 the fixture tfx will be estimated. | 481 | OP.AUTO_TFX=xls_parameter(parameter, 'AUTO_TFX', false,0); % Mostly used for device ERL. If sent to 1 the fixture tfx will be estimated. | ||
489 | OP.LIMIT_JITTER_CONTRIB_TO_DFE_SPAN = xls_parameter(parameter, 'LIMIT_JITTER_CONTRIB_TO_DFE_SPAN', false, false); % Experimental. Default is 0. | 482 | OP.LIMIT_JITTER_CONTRIB_TO_DFE_SPAN = xls_parameter(parameter, 'LIMIT_JITTER_CONTRIB_TO_DFE_SPAN', false, false); % Experimental. Default is 0. | ||
490 | %OP.impulse_response_truncation_threshold = xls_parameter(parameter, 'Impulse response truncatio threshold', false, 1e-3); | 483 | %OP.impulse_response_truncation_threshold = xls_parameter(parameter, 'Impulse response truncatio threshold', false, 1e-3); | ||
491 | OP.impulse_response_truncation_threshold = xls_parameter(parameter, 'Impulse response truncation threshold', false, 1e-3); % zero padding threshold in fraction of IR peak for the impulse response. Effectively controls the length of time for the PR. Larger values decrease run time and accuracy. Default is 1e-3. | 484 | OP.impulse_response_truncation_threshold = xls_parameter(parameter, 'Impulse response truncation threshold', false, 1e-3); % zero padding threshold in fraction of IR peak for the impulse response. Effectively controls the length of time for the PR. Larger values decrease run time and accuracy. Default is 1e-3. | ||
492 | OP.interp_sparam_mag = xls_parameter(parameter, 'S-parameter magnitude extrapolation policy', false, 'linear_trend_to_DC'); % magnitued extrapolation method | 485 | OP.interp_sparam_mag = xls_parameter(parameter, 'S-parameter magnitude extrapolation policy', false, 'linear_trend_to_DC'); % magnitued extrapolation method | ||
493 | OP.interp_sparam_phase = xls_parameter(parameter, 'S-parameter phase extrapolation policy', false, 'extrap_cubic_to_dc_linear_to_inf'); % phase extrapolation method | 486 | OP.interp_sparam_phase = xls_parameter(parameter, 'S-parameter phase extrapolation policy', false, 'extrap_cubic_to_dc_linear_to_inf'); % phase extrapolation method | ||
494 | OP.PMD_type= xls_parameter(parameter, 'PMD_type', false,'C2C'); % Either C2C or C2M. C2M is for computing VEC and VEO | 487 | OP.PMD_type= xls_parameter(parameter, 'PMD_type', false,'C2C'); % Either C2C or C2M. C2M is for computing VEC and VEO | ||
495 | OP.PHY= xls_parameter(parameter, 'PHY', false, OP.PMD_type); % The keyword OP.PMD_type is now used | 488 | OP.PHY= xls_parameter(parameter, 'PHY', false, OP.PMD_type); % The keyword OP.PMD_type is now used | ||
496 | if strcmpi(OP.PHY,'C2M') | 489 | if strcmpi(OP.PHY,'C2M') | ||
497 | OP.EW=true; | 490 | OP.EW=true; | ||
498 | else | 491 | else | ||
499 | param.T_O=0; % make sure when c2c that sample is at Ts | 492 | param.T_O=0; % make sure when c2c that sample is at Ts | ||
500 | end | 493 | end | ||
501 | if param.Min_VEO ~=0 && strcmpi(OP.PHY,'C2C') | 494 | if param.Min_VEO ~=0 && strcmpi(OP.PHY,'C2C') | ||
502 | OP.PHY='C2Mcom'; | 495 | OP.PHY='C2Mcom'; | ||
503 | end | 496 | end | ||
504 | OP.TDECQ=xls_parameter(parameter, 'TDECQ', false, 0); % Experimental, for only option is none (0) or vma. Default is 0. | 497 | OP.TDECQ=xls_parameter(parameter, 'TDECQ', false, 0); % Experimental, for only option is none (0) or vma. Default is 0. | ||
505 | switch lower(OP.TDECQ) | 498 | switch lower(OP.TDECQ) | ||
506 | case {false 'none' 'vma'} | 499 | case {false 'none' 'vma'} | ||
507 | otherwise | 500 | otherwise | ||
508 | error('%s unrecognized TDECQ keyword',OP.TDECQ) | 501 | error('%s unrecognized TDECQ keyword',OP.TDECQ) | ||
509 | end | 502 | end | ||
510 | OP.RUNTAG = xls_parameter(parameter, 'RUNTAG', false, ''); % This string is appended to the begining of results files | 503 | OP.RUNTAG = xls_parameter(parameter, 'RUNTAG', false, ''); % This string is appended to the begining of results files | ||
511 | if isnan(OP.RUNTAG), OP.RUNTAG='';end | 504 | if isnan(OP.RUNTAG), OP.RUNTAG='';end | ||
512 | if isnumeric(OP.RUNTAG), OP.RUNTAG=num2str(OP.RUNTAG);end | 505 | if isnumeric(OP.RUNTAG), OP.RUNTAG=num2str(OP.RUNTAG);end | ||
513 | OP.CDR=xls_parameter(parameter, 'CDR', false, 'MM');% 12/21 from Yuchun Lu to accomdate 'Mod-MM', Defautt is 'MM' | 506 | OP.CDR=xls_parameter(parameter, 'CDR', false, 'MM');% 12/21 from Yuchun Lu to accomdate 'Mod-MM', Defautt is 'MM' | ||
514 | OP.Optimize_loop_speed_up =xls_parameter(parameter, 'Optimize_loop_speed_up', true , 0);% If set to 0 (or default) normal looping, If set to 1 loop speedup by slightly reducing PD Fbin and FIR_threshold for optimize looping only | 507 | OP.Optimize_loop_speed_up =xls_parameter(parameter, 'Optimize_loop_speed_up', true , 0);% If set to 0 (or default) normal looping, If set to 1 loop speedup by slightly reducing PD Fbin and FIR_threshold for optimize looping only | ||
515 | % Parameters for error burst probability calculation. Not officially used | 508 | % Parameters for error burst probability calculation. Not officially used | ||
516 | OP.use_simple_EP_model = xls_parameter(parameter, 'Use simple error propagation model', false, false);% Use to calculate burst error rate (not normally used | 509 | OP.use_simple_EP_model = xls_parameter(parameter, 'Use simple error propagation model', false, false);% Use to calculate burst error rate (not normally used | ||
517 | OP.nburst = xls_parameter(parameter, 'Max burst length calculated', false, 0); % Use to calculate burst error rate (not normally used) | 510 | OP.nburst = xls_parameter(parameter, 'Max burst length calculated', false, 0); % Use to calculate burst error rate (not normally used) | ||
518 | OP.COM_EP_margin = xls_parameter(parameter, 'Error propagation COM margin', false, 0); % Use to calculate error propogation (not normally used) | 511 | OP.COM_EP_margin = xls_parameter(parameter, 'Error propagation COM margin', false, 0); % Use to calculate error propogation (not normally used) | ||
519 | OP.USE_ETA0_PSD = xls_parameter(parameter, 'USE_ETA0_PSD', false, 0); % Used eta_0 PSD equaiton for sigma_n. Default is 0. Do not use. | 512 | OP.USE_ETA0_PSD = xls_parameter(parameter, 'USE_ETA0_PSD', false, 0); % Used eta_0 PSD equaiton for sigma_n. Default is 0. Do not use. | ||
520 | OP.SAVE_CONFIG2MAT = xls_parameter(parameter, 'SAVE_CONFIG2MAT', false, 0); % If set to 1 (default) saves parameters in mat file. Requires DIAGNOSTICS to be set. | 513 | OP.SAVE_CONFIG2MAT = xls_parameter(parameter, 'SAVE_CONFIG2MAT', false, 0); % If set to 1 (default) saves parameters in mat file. Requires DIAGNOSTICS to be set. | ||
521 | OP.PLOT_CM = xls_parameter(parameter, 'PLOT_CM', false, 0); % Display CM plots if set to 1. Default is 0. | 514 | OP.PLOT_CM = xls_parameter(parameter, 'PLOT_CM', false, 0); % Display CM plots if set to 1. Default is 0. | ||
522 | OP.fraction_of_F_range_start_extrap_from= xls_parameter(parameter, 'fraction_of_F_range_start_extrap_from', true, 0.75); % Frequency (fb) where high frequency extropolation begins for computing IR. Helps control Gibbs phenomena. defualt is 0.75. | 515 | OP.fraction_of_F_range_start_extrap_from= xls_parameter(parameter, 'fraction_of_F_range_start_extrap_from', true, 0.75); % Frequency (fb) where high frequency extropolation begins for computing IR. Helps control Gibbs phenomena. defualt is 0.75. | ||
523 | OP.COMPUTE_RILN = xls_parameter(parameter, 'COMPUTE_RILN', false, 0); % Computes RILN default is 0. FOM_RILN reported | 516 | OP.COMPUTE_RILN = xls_parameter(parameter, 'COMPUTE_RILN', false, 0); % Computes RILN default is 0. FOM_RILN reported | ||
524 | OP.COMPUTE_TDILN = xls_parameter(parameter, 'COMPUTE_TDILN', false, OP.COMPUTE_RILN); % computes TD ILN from complex freq IL fit. FOM_TDILN reported. | 517 | OP.COMPUTE_TDILN = xls_parameter(parameter, 'COMPUTE_TDILN', false, OP.COMPUTE_RILN); % computes TD ILN from complex freq IL fit. FOM_TDILN reported. | ||
525 | OP.SAVE_KEYWORD_FILE = xls_parameter(parameter, 'SAVE_KEYWORD_FILE', false, 0); % Save csv file of COM parameter (OP) and keywords. Not implemented. | 518 | OP.SAVE_KEYWORD_FILE = xls_parameter(parameter, 'SAVE_KEYWORD_FILE', false, 0); % Save csv file of COM parameter (OP) and keywords. Not implemented. | ||
526 | OP.SNR_TXwC0 = xls_parameter(parameter, 'SNR_TXwC0', false, 0); % Adjust SNR_TX with C0 | 519 | OP.SNR_TXwC0 = xls_parameter(parameter, 'SNR_TXwC0', false, 0); % Adjust SNR_TX with C0 | ||
527 | OP.MLSE = xls_parameter(parameter, 'MLSE', false, 0); % MLSE 0,1,2, 3 (no MLSE, U1 MLSE, experimetal MLSE, U3 MLSE) | 520 | OP.MLSE = xls_parameter(parameter, 'MLSE', false, 0); % MLSE 0,1,2, 3 (no MLSE, U1 MLSE, experimetal MLSE, U3 MLSE) | ||
528 | OP.RXFFE_FLOAT_CTL = xls_parameter(parameter, 'RXFFE FLOAT CTL', false, 'FOM'); % select taps (taps), pulse response (ISI), or FOM for floating taps determination | 521 | OP.RXFFE_FLOAT_CTL = xls_parameter(parameter, 'RXFFE FLOAT CTL', false, 'FOM'); % select taps (taps), pulse response (ISI), or FOM for floating taps determination | ||
529 | OP.RXFFE_TAP_CONSTRAINT =xls_parameter(parameter, 'RXFFE TAP CONSTRAINT', false, 'Unity Cursor'); % "Unity sum taps", "Unity Cursor", of unbounded | 522 | OP.RXFFE_TAP_CONSTRAINT =xls_parameter(parameter, 'RXFFE TAP CONSTRAINT', false, 'Unity Cursor'); % "Unity sum taps", "Unity Cursor", of unbounded | ||
530 | if OP.MLSE && param.ndfe==0 | 523 | if OP.MLSE && param.ndfe==0 | ||
531 | error('At least DFE 1 must be set to use MLSE'); | 524 | error('At least DFE 1 must be set to use MLSE'); | ||
532 | end | 525 | end | ||
533 | OP.TIME_AXIS = xls_parameter(parameter, 'TIME_AXIS', false, 'UI'); % if0 OP.display set pulse response xaxis to seconds or UI | 526 | OP.TIME_AXIS = xls_parameter(parameter, 'TIME_AXIS', false, 'UI'); % if0 OP.display set pulse response xaxis to seconds or UI | ||
534 | % MNSE parameters | 527 | % MNSE parameters | ||
535 | OP.Do_XT_Noise= xls_parameter(parameter, 'Do_XT_Noise', false, 1); | 528 | OP.Do_XT_Noise= xls_parameter(parameter, 'Do_XT_Noise', false, 1); | ||
536 | OP.FFE_SNR= xls_parameter(parameter, 'FFE_SNR', false, 1); | 529 | OP.FFE_SNR= xls_parameter(parameter, 'FFE_SNR', false, 1); | ||
537 | OP.Do_Colored_Noise= xls_parameter(parameter, 'Do_Colored_Noise', false, 1); | 530 | OP.Do_Colored_Noise= xls_parameter(parameter, 'Do_Colored_Noise', false, 1); | ||
538 | OP.Do_White_Noise=xls_parameter(parameter, 'Do_White_Noise', false, 0); | 531 | OP.Do_White_Noise=xls_parameter(parameter, 'Do_White_Noise', false, 0); | ||
539 | OP.FFE_OPT_METHOD=xls_parameter(parameter,'FFE_OPT_METHOD',false,'MMSE'); % 'MMSE','FV-LMS' | 532 | OP.FFE_OPT_METHOD=xls_parameter(parameter,'FFE_OPT_METHOD',false,'MMSE'); % 'MMSE','FV-LMS' | ||
540 | % Commit request 4p4_7, healey_3dj_COM_01_240416 | 533 | % Commit request 4p4_7, healey_3dj_COM_01_240416 | ||
541 | OP.TS_SRCH_MODE=xls_parameter(parameter,'TS_SRCH_MODE',false,'full-sweep'); % full-sweep, middle | 534 | OP.TS_SRCH_MODE=xls_parameter(parameter,'TS_SRCH_MODE',false,'full-sweep'); % full-sweep, middle | ||
542 | % need to make sure TD mode does not invoke FD operations | 535 | % need to make sure TD mode does not invoke FD operations | ||
543 | if OP.TDMODE % need to set GET_FD false of TDMODE | 536 | if OP.TDMODE % need to set GET_FD false of TDMODE | ||
544 | OP.GET_FD=false; | 537 | OP.GET_FD=false; | ||
545 | OP.ERL_ONLY=0; | 538 | OP.ERL_ONLY=0; | ||
546 | OP.ERL=0; | 539 | OP.ERL=0; | ||
547 | OP.PTDR=0; | 540 | OP.PTDR=0; | ||
548 | OP.TDR=0; | 541 | OP.TDR=0; | ||
549 | OP.RX_CALIBRATION=0; | 542 | OP.RX_CALIBRATION=0; | ||
550 | end | 543 | end | ||
551 | if OP.SAVE_CONFIG2MAT || OP.CONFIG2MAT_ONLY | 544 | if OP.SAVE_CONFIG2MAT || OP.CONFIG2MAT_ONLY | ||
552 | save(matcongfile ,'parameter'); | 545 | save(matcongfile ,'parameter'); | ||
553 | end | 546 | end | ||
554 | 547 | ||||
555 | 548 | ||||
556 | %% At the very end of Parameter reading, swap in the proper Tx and Rx values for package parameters based on pkg name | 549 | %% At the very end of Parameter reading, swap in the proper Tx and Rx values for package parameters based on pkg name | ||
557 | if ~isempty(param.PKG_NAME) | 550 | if ~isempty(param.PKG_NAME) | ||
558 | if length(param.PKG_NAME) == 1 | 551 | if length(param.PKG_NAME) == 1 | ||
559 | param.PKG_NAME = [param.PKG_NAME param.PKG_NAME]; | 552 | param.PKG_NAME = [param.PKG_NAME param.PKG_NAME]; | ||
560 | end | 553 | end | ||
561 | tx_rx_fields = {'C_pkg_board' 'R_diepad'}; | 554 | tx_rx_fields = {'C_pkg_board' 'R_diepad'}; | ||
562 | tx_rx_fields_matrix = {'pkg_Z_c'}; | 555 | tx_rx_fields_matrix = {'pkg_Z_c'}; | ||
563 | tx_fields = {'z_p_tx_cases' 'z_p_fext_cases' 'pkg_gamma0_a1_a2' 'pkg_tau' 'a_thru' 'a_fext'}; | 556 | tx_fields = {'z_p_tx_cases' 'z_p_fext_cases' 'pkg_gamma0_a1_a2' 'pkg_tau' 'a_thru' 'a_fext'}; | ||
564 | rx_fields = {'z_p_rx_cases' 'a_next' 'z_p_next_cases'}; | 557 | rx_fields = {'z_p_rx_cases' 'a_next' 'z_p_next_cases'}; | ||
565 | tx_pkg_name=param.PKG_NAME{1}; | 558 | tx_pkg_name=param.PKG_NAME{1}; | ||
566 | rx_pkg_name=param.PKG_NAME{2}; | 559 | rx_pkg_name=param.PKG_NAME{2}; | ||
567 | tx_pkg_struct=param.PKG.(tx_pkg_name); | 560 | tx_pkg_struct=param.PKG.(tx_pkg_name); | ||
568 | rx_pkg_struct=param.PKG.(rx_pkg_name); | 561 | rx_pkg_struct=param.PKG.(rx_pkg_name); | ||
569 |
| 562 |
| ||
570 | %tx_rx_fields: put the value from the tx package in the Tx position and the value from the rx package in the RX position | 563 | %tx_rx_fields: put the value from the tx package in the Tx position and the value from the rx package in the RX position | ||
571 | for j=1:length(tx_rx_fields) | 564 | for j=1:length(tx_rx_fields) | ||
572 | tx_val = tx_pkg_struct.(tx_rx_fields{j}); | 565 | tx_val = tx_pkg_struct.(tx_rx_fields{j}); | ||
573 | rx_val = rx_pkg_struct.(tx_rx_fields{j}); | 566 | rx_val = rx_pkg_struct.(tx_rx_fields{j}); | ||
574 | param.(tx_rx_fields{j}) = [tx_val(1) rx_val(2)]; | 567 | param.(tx_rx_fields{j}) = [tx_val(1) rx_val(2)]; | ||
575 | end | 568 | end | ||
576 |
| 569 |
| ||
577 | %tx_rx_fields_matrix: same as tx_rx_fields but in matrix form | 570 | %tx_rx_fields_matrix: same as tx_rx_fields but in matrix form | ||
578 | for j=1:length(tx_rx_fields_matrix) | 571 | for j=1:length(tx_rx_fields_matrix) | ||
579 | tx_val = tx_pkg_struct.(tx_rx_fields_matrix{j})(1,:); | 572 | tx_val = tx_pkg_struct.(tx_rx_fields_matrix{j})(1,:); | ||
580 | rx_val = rx_pkg_struct.(tx_rx_fields_matrix{j})(2,:); | 573 | rx_val = rx_pkg_struct.(tx_rx_fields_matrix{j})(2,:); | ||
581 | param.(tx_rx_fields_matrix{j}) = [tx_val; rx_val]; | 574 | param.(tx_rx_fields_matrix{j}) = [tx_val; rx_val]; | ||
582 | end | 575 | end | ||
583 |
| 576 |
| ||
584 | %tx_fields: use only the tx package values | 577 | %tx_fields: use only the tx package values | ||
585 | for j=1:length(tx_fields) | 578 | for j=1:length(tx_fields) | ||
586 | param.(tx_fields{j}) = tx_pkg_struct.(tx_fields{j}); | 579 | param.(tx_fields{j}) = tx_pkg_struct.(tx_fields{j}); | ||
587 | end | 580 | end | ||
588 |
| 581 |
| ||
589 | %rx_fields: use only the rx package values | 582 | %rx_fields: use only the rx package values | ||
590 | for j=1:length(rx_fields) | 583 | for j=1:length(rx_fields) | ||
591 | param.(rx_fields{j}) = rx_pkg_struct.(rx_fields{j}); | 584 | param.(rx_fields{j}) = rx_pkg_struct.(rx_fields{j}); | ||
592 | end | 585 | end | ||
593 | 586 | ||||
594 | end | 587 | end | ||
595 | 588 | ||||
596 | 589 | ||||
597 | %% | 590 | %% | ||
598 | 591 |