Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | #!/usr/bin/perl |
2 | ||
3 | $sims_launch_dir = $ARGV[0]; | |
4 | $dv_root = $ARGV[1]; | |
5 | $sys_config = $ARGV[2]; | |
6 | ||
7 | $efa = "$dv_root/verif/diag/assembly/include/efa.dat"; | |
8 | $efa_new = "$sims_launch_dir/efa.dat"; | |
9 | $sims_log = "$sims_launch_dir/sims.log"; | |
10 | ||
11 | open (EFA, $efa) || die("Could not open $efa!");; | |
12 | @efa_data = <EFA>; | |
13 | close(EFA); | |
14 | ||
15 | open (SIMSLOG, $sims_log); | |
16 | @sims_log = <SIMSLOG>; | |
17 | close(SIMSLOG); | |
18 | ||
19 | if($#sims_log > 0){ | |
20 | @sims_lines = grep { /^sims / } @sims_log; | |
21 | @sims_cmd = split /\s+/, shift @sims_lines; | |
22 | ||
23 | $i = $#sims_cmd; | |
24 | while($i > 0){ | |
25 | if($sims_cmd[$i] =~ /bank_set_mask=(\w+)/){ | |
26 | $bank_set_mask = $1; | |
27 | $i = -1; | |
28 | } | |
29 | $i--; | |
30 | } | |
31 | ||
32 | $i = $#sims_cmd; | |
33 | while($i > 0){ | |
34 | if($sims_cmd[$i] =~ /core_set_mask=(\w+)/){ | |
35 | $core_set_mask = $1; | |
36 | $i = -1; | |
37 | } | |
38 | $i--; | |
39 | } | |
40 | ||
41 | $i = $#sims_cmd; | |
42 | while($i > 0){ | |
43 | if($sims_cmd[$i] =~ /-midas_args=-DCORE_AVAIL=0x(\w+)/){ | |
44 | $dcore_avail = $1; | |
45 | $dcore_avail_write = 1; | |
46 | $i = -1; | |
47 | } | |
48 | $i--; | |
49 | } | |
50 | ||
51 | $i = $#sims_cmd; | |
52 | while($i > 0){ | |
53 | if($sims_cmd[$i] =~ /-midas_args=-DBANK_AVAIL=0x(\w+)/){ | |
54 | $dbank_avail = $1; | |
55 | $dbank_avail_write = 1; | |
56 | $i = -1; | |
57 | } | |
58 | $i--; | |
59 | } | |
60 | ||
61 | $i = $#sims_cmd; | |
62 | while($i > 0){ | |
63 | if($sims_cmd[$i] =~ /-midas_args=-DSERIAL_NUM=0x(\w+)/){ | |
64 | $dserial_num = $1; | |
65 | $i = -1; | |
66 | } | |
67 | $i--; | |
68 | } | |
69 | ||
70 | $i = $#sims_cmd; | |
71 | while($i > 0){ | |
72 | if($sims_cmd[$i] =~ /-sys=(\w+)/){ | |
73 | $sys = $1; | |
74 | $i = -1; | |
75 | } | |
76 | $i--; | |
77 | } | |
78 | $sys =~ /-sys=fc(\d+)/; | |
79 | $cores = $1; | |
80 | ||
81 | open EFANEW, ">$efa_new"; | |
82 | ||
83 | $dcore_avail = "00".$dcore_avail; | |
84 | $dbank_avail = "00".$dbank_avail; | |
85 | $dserial_num = "0000000000000000".$dserial_num; | |
86 | ||
87 | $dbank_avail =~ /(\w\w)$/; | |
88 | $dbank_avail_val = $1; | |
89 | $dbank_avail_val_int = hex($dbank_avail_val); | |
90 | $dbank_avail_val_int = $dbank_avail_val_int & 0xff; | |
91 | $dbank_avail_val_int = $dbank_avail_val_int | 0x8400000; | |
92 | if(get_parity($dbank_avail_val_int) == 1){ | |
93 | $dbank_avail_val_int = $dbank_avail_val_int | 0xf0000000; | |
94 | } | |
95 | else{ | |
96 | $dbank_avail_val_int = $dbank_avail_val_int | 0xe0000000; | |
97 | } | |
98 | ||
99 | $dcore_avail =~ /(\w\w)$/; | |
100 | $dcore_avail_val = $1; | |
101 | $dcore_avail_val_int = hex($dcore_avail_val); | |
102 | $dcore_avail_val_int = $dcore_avail_val_int & 0xff; | |
103 | $dcore_avail_val_int = $dcore_avail_val_int | 0x8000000; | |
104 | $temp = get_parity($dcore_avail_val_int); | |
105 | if(get_parity($dcore_avail_val_int) == 1){ | |
106 | $dcore_avail_val_int = $dcore_avail_val_int | 0xf0000000; | |
107 | } | |
108 | else{ | |
109 | $dcore_avail_val_int = $dcore_avail_val_int | 0xe0000000; | |
110 | } | |
111 | ||
112 | $dserial_num =~ /(\w\w\w\w\w\w)$/; | |
113 | $dserial_num_lower22 = $1; | |
114 | $dserial_num_lower22_int = hex($dserial_num_lower22); | |
115 | $dserial_num_lower22_int = $dserial_num_lower22_int & 0x3fffff; | |
116 | $dserial_num_lower22_int = $dserial_num_lower22_int | 0x8800000; | |
117 | if(get_parity($dserial_num_lower22_int) == 1){ | |
118 | $dserial_num_lower22_int = $dserial_num_lower22_int | 0xf0000000; | |
119 | } | |
120 | else{ | |
121 | $dserial_num_lower22_int = $dserial_num_lower22_int | 0xe0000000; | |
122 | } | |
123 | ||
124 | $dserial_num =~ /(\w\w\w\w\w\w)\w\w\w\w\w$/; | |
125 | $dserial_num_middle22 = $1; | |
126 | $dserial_num_middle22_int = hex($dserial_num_middle22); | |
127 | $dserial_num_middle22_int = $dserial_num_middle22_int >> 2; | |
128 | $dserial_num_middle22_int = $dserial_num_middle22_int & 0x3fffff; | |
129 | $dserial_num_middle22_int = $dserial_num_middle22_int | 0x8c00000; | |
130 | if(get_parity($dserial_num_middle22_int) == 1){ | |
131 | $dserial_num_middle22_int = $dserial_num_middle22_int | 0xf0000000; | |
132 | } | |
133 | else{ | |
134 | $dserial_num_middle22_int = $dserial_num_middle22_int | 0xe0000000; | |
135 | } | |
136 | ||
137 | $dserial_num =~ /(\w\w\w\w\w\w)\w\w\w\w\w\w\w\w\w\w\w$/; | |
138 | $dserial_num_upper20 = $1; | |
139 | $dserial_num_upper20_int = hex($dserial_num_upper20); | |
140 | $dserial_num_upper20_int = $dserial_num_upper20_int & 0xfffff; | |
141 | $dserial_num_upper20_int = $dserial_num_upper20_int | 0x9000000; | |
142 | if(get_parity($dserial_num_upper20_int) == 1){ | |
143 | $dserial_num_upper20_int = $dserial_num_upper20_int | 0xf0000000; | |
144 | } | |
145 | else{ | |
146 | $dserial_num_upper20_int = $dserial_num_upper20_int | 0xe0000000; | |
147 | } | |
148 | ||
149 | for($i=0; $i<=$#efa_data; $i++){ | |
150 | if($i == 0){ | |
151 | if($dcore_avail_write == 1){ | |
152 | printf EFANEW ("%x\n", $dcore_avail_val_int); | |
153 | } | |
154 | else{ | |
155 | $efa_data[$i] =~ /^(\w)(\w+)\w\w/; | |
156 | $parity = $1; | |
157 | $cores = $2; | |
158 | if($core_set_mask ne ""){ | |
159 | $core_set_mask_int = hex($core_set_mask); | |
160 | $parity = "f"; | |
161 | $bit_count = 0; | |
162 | for($j=0; $j<=7; $j++){ | |
163 | if($core_set_mask_int & 1 == 1){ | |
164 | $bit_count++; | |
165 | } | |
166 | $core_set_mask_int = $core_set_mask_int >> 1; | |
167 | } | |
168 | if($bit_count %2 == 1){ | |
169 | $parity = "e"; | |
170 | } | |
171 | $cores = $parity.$cores.$core_set_mask; | |
172 | } | |
173 | else{ | |
174 | if($sys eq "fc1"){ | |
175 | $cores = "e".$cores."01"; | |
176 | } | |
177 | elsif($sys eq "fc2"){ | |
178 | $cores = $parity.$cores."03"; | |
179 | } | |
180 | elsif($sys eq "fc4"){ | |
181 | $cores = $parity.$cores."0f"; | |
182 | } | |
183 | elsif($sys eq "fc8"){ | |
184 | $cores = $parity.$cores."ff"; | |
185 | } | |
186 | } | |
187 | print EFANEW $cores."\n"; | |
188 | } | |
189 | } | |
190 | elsif($i == 2){ | |
191 | if($dbank_avail_write == 1){ | |
192 | printf EFANEW ("%x\n", $dbank_avail_val_int); | |
193 | } | |
194 | else{ | |
195 | $efa_data[$i] =~ /^(\w+)\w\w/; | |
196 | $banks = $1; | |
197 | if($bank_set_mask ne ""){ | |
198 | $pm_hex = &pm_bank_mask_conversion(); | |
199 | $banks = $banks.$pm_hex; | |
200 | } | |
201 | else{ | |
202 | $banks = $banks."ff"; | |
203 | } | |
204 | print EFANEW $banks."\n"; | |
205 | } | |
206 | } | |
207 | elsif($i == 7){ | |
208 | printf EFANEW ("%x\n", $dserial_num_lower22_int); | |
209 | } | |
210 | elsif($i == 8){ | |
211 | printf EFANEW ("%x\n", $dserial_num_middle22_int); | |
212 | } | |
213 | elsif($i == 9){ | |
214 | printf EFANEW ("%x\n", $dserial_num_upper20_int); | |
215 | } | |
216 | else{ | |
217 | print EFANEW $efa_data[$i]; | |
218 | } | |
219 | } | |
220 | ||
221 | close(EFANEW); | |
222 | ||
223 | } | |
224 | else{ | |
225 | open EFANEW, ">$efa_new"; | |
226 | for($i=0; $i<=$#efa_data; $i++){ | |
227 | if($i == 0){ | |
228 | $efa_data[$i] =~ /^(\w)(\w+)\w\w/; | |
229 | $parity = $1; | |
230 | $cores = $2; | |
231 | if($sys_config eq "-fc1"){ | |
232 | $cores = "e".$cores."01"; | |
233 | } | |
234 | elsif($sys_config eq "-fc2"){ | |
235 | $cores = $parity.$cores."03"; | |
236 | } | |
237 | elsif($sys_config eq "-fc4"){ | |
238 | $cores = $parity.$cores."0f"; | |
239 | } | |
240 | elsif($sys_config eq "-fc8"){ | |
241 | $cores = $parity.$cores."ff"; | |
242 | } | |
243 | print EFANEW $cores."\n"; | |
244 | } | |
245 | else{ | |
246 | print EFANEW $efa_data[$i]; | |
247 | } | |
248 | } | |
249 | close(EFANEW); | |
250 | ||
251 | } | |
252 | ||
253 | sub get_parity{ | |
254 | my $i, $temp_input_val, $ones; | |
255 | ||
256 | $input_val = @_[0]; | |
257 | $ones = 0; | |
258 | for($i=0; $i<=27; $i++){ | |
259 | $temp_input_val = $input_val & 0x1; | |
260 | if($temp_input_val == 1){ | |
261 | $ones++; | |
262 | } | |
263 | $input_val = $input_val >> 1; | |
264 | } | |
265 | if($ones % 2 == 1){ | |
266 | return(1); | |
267 | } | |
268 | else{ | |
269 | return(0); | |
270 | } | |
271 | } | |
272 | ||
273 | sub bin2dec{ | |
274 | return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); | |
275 | } | |
276 | ||
277 | sub pm_core_mask_conversion{ | |
278 | $cores_hex = "ff"; | |
279 | ||
280 | return ($cores_hex); | |
281 | } | |
282 | ||
283 | sub pm_bank_mask_conversion{ | |
284 | $pm_hex = "ff"; | |
285 | if($bank_set_mask eq "1"){ | |
286 | $pm_hex = "03"; | |
287 | } | |
288 | elsif($bank_set_mask eq "2"){ | |
289 | $pm_hex = "0c"; | |
290 | } | |
291 | elsif($bank_set_mask eq "3"){ | |
292 | $pm_hex = "0f"; | |
293 | } | |
294 | elsif($bank_set_mask eq "4"){ | |
295 | $pm_hex = "30"; | |
296 | } | |
297 | elsif($bank_set_mask eq "5"){ | |
298 | $pm_hex = "33"; | |
299 | } | |
300 | elsif($bank_set_mask eq "6"){ | |
301 | $pm_hex = "3c"; | |
302 | } | |
303 | elsif($bank_set_mask eq "8"){ | |
304 | $pm_hex = "c0"; | |
305 | } | |
306 | elsif($bank_set_mask eq "9"){ | |
307 | $pm_hex = "c3"; | |
308 | } | |
309 | elsif($bank_set_mask eq "a"){ | |
310 | $pm_hex = "cc"; | |
311 | } | |
312 | elsif($bank_set_mask eq "c"){ | |
313 | $pm_hex = "f0"; | |
314 | } | |
315 | return ($pm_hex); | |
316 | } |