Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / bin / efa_gen
CommitLineData
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
11open (EFA, $efa) || die("Could not open $efa!");;
12@efa_data = <EFA>;
13close(EFA);
14
15open (SIMSLOG, $sims_log);
16@sims_log = <SIMSLOG>;
17close(SIMSLOG);
18
19if($#sims_log > 0){
20@sims_lines = grep { /^sims / } @sims_log;
21@sims_cmd = split /\s+/, shift @sims_lines;
22
23$i = $#sims_cmd;
24while($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;
33while($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;
42while($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;
52while($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;
62while($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;
71while($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
81open 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;
92if(get_parity($dbank_avail_val_int) == 1){
93 $dbank_avail_val_int = $dbank_avail_val_int | 0xf0000000;
94}
95else{
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);
105if(get_parity($dcore_avail_val_int) == 1){
106 $dcore_avail_val_int = $dcore_avail_val_int | 0xf0000000;
107}
108else{
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;
117if(get_parity($dserial_num_lower22_int) == 1){
118 $dserial_num_lower22_int = $dserial_num_lower22_int | 0xf0000000;
119}
120else{
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;
130if(get_parity($dserial_num_middle22_int) == 1){
131 $dserial_num_middle22_int = $dserial_num_middle22_int | 0xf0000000;
132}
133else{
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;
142if(get_parity($dserial_num_upper20_int) == 1){
143 $dserial_num_upper20_int = $dserial_num_upper20_int | 0xf0000000;
144}
145else{
146 $dserial_num_upper20_int = $dserial_num_upper20_int | 0xe0000000;
147}
148
149for($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
221close(EFANEW);
222
223}
224else{
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
253sub 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
273sub bin2dec{
274 return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
275}
276
277sub pm_core_mask_conversion{
278 $cores_hex = "ff";
279
280 return ($cores_hex);
281}
282
283sub 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}