Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2 | Rev 11 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | /* |
1 | /* |
| 2 | * $Id: printout.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $ |
2 | * $Id: printout.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $ |
| 3 | * |
3 | * |
| 4 | * $Log: printout.c,v $ |
4 | * $Log: printout.c,v $ |
| 5 | * Revision 1.1.1.1 2003/11/04 23:34:57 mjames |
5 | * Revision 1.1.1.1 2003/11/04 23:34:57 mjames |
| 6 | * Imported into local repositrory |
6 | * Imported into local repositrory |
| Line 77... | Line 77... | ||
| 77 | * |
77 | * |
| 78 | * Revision 1.3 2000/11/29 21:51:19 mjames |
78 | * Revision 1.3 2000/11/29 21:51:19 mjames |
| 79 | * Fine tuning of software |
79 | * Fine tuning of software |
| 80 | * |
80 | * |
| 81 | * Revision 1.2 2000/10/21 20:41:29 mjames |
81 | * Revision 1.2 2000/10/21 20:41:29 mjames |
| 82 | * Added the 'write flatten' command that only lists the wires |
82 | * Added the 'write flatten' command that only lists the wires |
| 83 | * created by making jumpered connections rather than listing |
83 | * created by making jumpered connections rather than listing |
| 84 | * the jumpers themselves |
84 | * the jumpers themselves |
| 85 | * |
85 | * |
| 86 | * Revision 1.1.1.1 2000/10/19 21:58:39 mjames |
86 | * Revision 1.1.1.1 2000/10/19 21:58:39 mjames |
| 87 | * Mike put it here |
87 | * Mike put it here |
| 88 | * |
88 | * |
| 89 | * |
89 | * |
| 90 | * Revision 1.68 2000/10/04 10:37:08 10:37:08 mjames (Mike James) |
90 | * Revision 1.68 2000/10/04 10:37:08 10:37:08 mjames (Mike James) |
| 91 | * Modified for Vertical2 : support COMPONENTS and SIGNALS |
91 | * Modified for Vertical2 : support COMPONENTS and SIGNALS |
| 92 | * |
92 | * |
| 93 | * Revision 1.68 2000/10/04 10:37:08 10:37:08 mjames (Mike James) |
93 | * Revision 1.68 2000/10/04 10:37:08 10:37:08 mjames (Mike James) |
| 94 | * Part of Release PSAVAT01 |
94 | * Part of Release PSAVAT01 |
| 95 | * |
95 | * |
| 96 | * Revision 1.67 2000/10/02 11:04:18 11:04:18 mjames (Mike James) |
96 | * Revision 1.67 2000/10/02 11:04:18 11:04:18 mjames (Mike James) |
| 97 | * new_vhdl |
97 | * new_vhdl |
| 98 | * |
98 | * |
| 99 | * Revision 1.66 2000/09/27 14:42:19 14:42:19 mjames (Mike James) |
99 | * Revision 1.66 2000/09/27 14:42:19 14:42:19 mjames (Mike James) |
| 100 | * Part of Release Sep_27_ST_2000 |
100 | * Part of Release Sep_27_ST_2000 |
| 101 | * |
101 | * |
| 102 | * Revision 1.65 2000/09/27 14:27:57 14:27:57 mjames (Mike James) |
102 | * Revision 1.65 2000/09/27 14:27:57 14:27:57 mjames (Mike James) |
| 103 | * Made list renamed pins refer to device identifier. |
103 | * Made list renamed pins refer to device identifier. |
| 104 | * |
104 | * |
| 105 | * Revision 1.64 2000/09/27 10:58:07 10:58:07 mjames (Mike James) |
105 | * Revision 1.64 2000/09/27 10:58:07 10:58:07 mjames (Mike James) |
| 106 | * Started using g_class member of generic structure to control |
106 | * Started using g_class member of generic structure to control |
| 107 | * printing. |
107 | * printing. |
| 108 | * ,. |
108 | * ,. |
| 109 | * |
109 | * |
| 110 | * Revision 1.63 2000/09/21 10:15:49 10:15:49 mjames (Mike James) |
110 | * Revision 1.63 2000/09/21 10:15:49 10:15:49 mjames (Mike James) |
| 111 | * Part of Release Sep21Alpha |
111 | * Part of Release Sep21Alpha |
| 112 | * |
112 | * |
| 113 | * Revision 1.62 2000/09/21 09:47:19 09:47:19 mjames (Mike James) |
113 | * Revision 1.62 2000/09/21 09:47:19 09:47:19 mjames (Mike James) |
| 114 | * Added code to deal with pin equivalents |
114 | * Added code to deal with pin equivalents |
| 115 | * |
115 | * |
| 116 | * Revision 1.61 2000/08/25 09:57:15 09:57:15 mjames (Mike James) |
116 | * Revision 1.61 2000/08/25 09:57:15 09:57:15 mjames (Mike James) |
| 117 | * Part of Release Aug25_alpha |
117 | * Part of Release Aug25_alpha |
| 118 | * |
118 | * |
| 119 | * Revision 1.60 2000/08/16 08:57:31 08:57:31 mjames (Mike James) |
119 | * Revision 1.60 2000/08/16 08:57:31 08:57:31 mjames (Mike James) |
| 120 | * Part of Release CD01_Aug2000 |
120 | * Part of Release CD01_Aug2000 |
| 121 | * |
121 | * |
| 122 | * Revision 1.59 2000/08/14 14:45:12 14:45:12 mjames (Mike James) |
122 | * Revision 1.59 2000/08/14 14:45:12 14:45:12 mjames (Mike James) |
| 123 | * Part of Release Aug_14_2000 |
123 | * Part of Release Aug_14_2000 |
| 124 | * |
124 | * |
| 125 | * Revision 1.58 2000/08/14 14:43:29 14:43:29 mjames (Mike James) |
125 | * Revision 1.58 2000/08/14 14:43:29 14:43:29 mjames (Mike James) |
| 126 | * Added power pins |
126 | * Added power pins |
| 127 | * |
127 | * |
| 128 | * Revision 1.57 2000/08/11 08:30:32 08:30:32 mjames (Mike James) |
128 | * Revision 1.57 2000/08/11 08:30:32 08:30:32 mjames (Mike James) |
| 129 | * Part of Release Aug_11_2000 |
129 | * Part of Release Aug_11_2000 |
| 130 | * |
130 | * |
| 131 | * Revision 1.56 2000/08/09 10:31:47 10:31:47 mjames (Mike James) |
131 | * Revision 1.56 2000/08/09 10:31:47 10:31:47 mjames (Mike James) |
| 132 | * Part of Release Aug__9_2000 |
132 | * Part of Release Aug__9_2000 |
| 133 | * |
133 | * |
| 134 | * Revision 1.55 2000/05/31 11:42:57 11:42:57 mjames (Mike James) |
134 | * Revision 1.55 2000/05/31 11:42:57 11:42:57 mjames (Mike James) |
| 135 | * Part of Release May_31_2000 |
135 | * Part of Release May_31_2000 |
| 136 | * |
136 | * |
| 137 | * Revision 1.54 2000/05/08 17:01:38 17:01:38 mjames (Mike James) |
137 | * Revision 1.54 2000/05/08 17:01:38 17:01:38 mjames (Mike James) |
| 138 | * Part of Release May__8_2000 |
138 | * Part of Release May__8_2000 |
| 139 | * |
139 | * |
| 140 | * Revision 1.53 2000/05/08 16:59:31 16:59:31 mjames (Mike James) |
140 | * Revision 1.53 2000/05/08 16:59:31 16:59:31 mjames (Mike James) |
| 141 | * Part of Release May__8_2000 |
141 | * Part of Release May__8_2000 |
| 142 | * |
142 | * |
| 143 | * Revision 1.52 2000/05/08 16:57:08 16:57:08 mjames (Mike James) |
143 | * Revision 1.52 2000/05/08 16:57:08 16:57:08 mjames (Mike James) |
| 144 | * Part of Release May__8_2000 |
144 | * Part of Release May__8_2000 |
| 145 | * |
145 | * |
| 146 | * Revision 1.51 2000/03/08 16:19:24 16:19:24 mjames (Mike James) |
146 | * Revision 1.51 2000/03/08 16:19:24 16:19:24 mjames (Mike James) |
| 147 | * New version including PC |
147 | * New version including PC |
| 148 | * |
148 | * |
| 149 | * Revision 1.48 2000/02/18 15:45:44 15:45:44 mjames (Mike James) |
149 | * Revision 1.48 2000/02/18 15:45:44 15:45:44 mjames (Mike James) |
| 150 | * Amended to support PC |
150 | * Amended to support PC |
| 151 | * |
151 | * |
| 152 | * Revision 1.47 2000/01/20 15:58:48 15:58:48 mjames (Mike James) |
152 | * Revision 1.47 2000/01/20 15:58:48 15:58:48 mjames (Mike James) |
| 153 | * Part of Release R22 |
153 | * Part of Release R22 |
| 154 | * |
154 | * |
| 155 | * Revision 1.46 99/12/22 11:15:28 11:15:28 mjames (Mike James) |
155 | * Revision 1.46 99/12/22 11:15:28 11:15:28 mjames (Mike James) |
| 156 | * Part of Release Dec_22_1999 |
156 | * Part of Release Dec_22_1999 |
| 157 | * |
157 | * |
| 158 | * Revision 1.45 99/11/23 13:53:12 13:53:12 mjames (Mike James) |
158 | * Revision 1.45 99/11/23 13:53:12 13:53:12 mjames (Mike James) |
| 159 | * Addedd Verilog support and removed VHDL functions to a separate |
159 | * Addedd Verilog support and removed VHDL functions to a separate |
| 160 | * file |
160 | * file |
| 161 | * |
161 | * |
| 162 | * Revision 1.40 98/11/27 15:15:48 15:15:48 mjames (Mike James) |
162 | * Revision 1.40 98/11/27 15:15:48 15:15:48 mjames (Mike James) |
| 163 | * Altered listing of jumpers |
163 | * Altered listing of jumpers |
| 164 | * |
164 | * |
| 165 | * Revision 1.39 98/11/16 13:18:36 13:18:36 mjames (Mike James) |
165 | * Revision 1.39 98/11/16 13:18:36 13:18:36 mjames (Mike James) |
| 166 | * |
166 | * |
| 167 | * Revision 1.38 98/08/12 14:21:57 14:21:57 mjames (Mike James) |
167 | * Revision 1.38 98/08/12 14:21:57 14:21:57 mjames (Mike James) |
| 168 | * COrrected VHDL printout |
168 | * COrrected VHDL printout |
| 169 | * |
169 | * |
| 170 | * Revision 1.37 98/07/14 13:25:38 13:25:38 mjames (Mike James) |
170 | * Revision 1.37 98/07/14 13:25:38 13:25:38 mjames (Mike James) |
| 171 | * Altered device printout to meet new requirements |
171 | * Altered device printout to meet new requirements |
| 172 | * |
172 | * |
| 173 | * Revision 1.36 98/06/15 14:19:01 14:19:01 mjames (Mike James) |
173 | * Revision 1.36 98/06/15 14:19:01 14:19:01 mjames (Mike James) |
| 174 | * Added template printout functionality |
174 | * Added template printout functionality |
| 175 | * |
175 | * |
| 176 | * Revision 1.35 98/04/24 13:49:16 13:49:16 mjames (Mike James) |
176 | * Revision 1.35 98/04/24 13:49:16 13:49:16 mjames (Mike James) |
| 177 | * Avoid priting 'generics' for chips without them |
177 | * Avoid priting 'generics' for chips without them |
| 178 | * |
178 | * |
| 179 | * Revision 1.34 98/03/16 11:37:55 11:37:55 mjames (Mike James) |
179 | * Revision 1.34 98/03/16 11:37:55 11:37:55 mjames (Mike James) |
| 180 | * Added generics to printout listings |
180 | * Added generics to printout listings |
| 181 | * |
181 | * |
| 182 | * Revision 1.33 98/02/11 11:27:01 11:27:01 mjames (Mike James) |
182 | * Revision 1.33 98/02/11 11:27:01 11:27:01 mjames (Mike James) |
| 183 | * Checked in for version 6.2a |
183 | * Checked in for version 6.2a |
| 184 | * |
184 | * |
| 185 | * Revision 1.32 98/01/13 11:33:41 11:33:41 mjames (Mike James) |
185 | * Revision 1.32 98/01/13 11:33:41 11:33:41 mjames (Mike James) |
| 186 | * Added the bility to use a VHDL template file |
186 | * Added the bility to use a VHDL template file |
| 187 | * containing $ENT$ and $ARCH$ in the position where one |
187 | * containing $ENT$ and $ARCH$ in the position where one |
| 188 | * wants the entity and architecture to be given. |
188 | * wants the entity and architecture to be given. |
| 189 | * |
189 | * |
| 190 | * Revision 1.31 97/04/23 08:43:21 08:43:21 mjames (Mike James) |
190 | * Revision 1.31 97/04/23 08:43:21 08:43:21 mjames (Mike James) |
| 191 | * CHecked in for release rel23041997 |
191 | * CHecked in for release rel23041997 |
| 192 | * |
192 | * |
| 193 | * Revision 1.30 96/12/23 15:19:14 15:19:14 mjames (Mike James) |
193 | * Revision 1.30 96/12/23 15:19:14 15:19:14 mjames (Mike James) |
| 194 | * Altered headline for UMA email address |
194 | * Altered headline for UMA email address |
| 195 | * |
195 | * |
| 196 | * Revision 1.29 96/12/23 15:12:52 15:12:52 mjames (Mike James) |
196 | * Revision 1.29 96/12/23 15:12:52 15:12:52 mjames (Mike James) |
| 197 | * Fixing printout routines to work with templates |
197 | * Fixing printout routines to work with templates |
| 198 | * (somewhat unecessary as they are on a different linked list |
198 | * (somewhat unecessary as they are on a different linked list |
| 199 | * to the sockets which was causing problems until I saw |
199 | * to the sockets which was causing problems until I saw |
| 200 | * the mistake. |
200 | * the mistake. |
| 201 | * |
201 | * |
| 202 | * Revision 1.28 96/12/23 10:23:33 10:23:33 mjames (Mike James) |
202 | * Revision 1.28 96/12/23 10:23:33 10:23:33 mjames (Mike James) |
| 203 | * Altered to make it sort the results |
203 | * Altered to make it sort the results |
| 204 | * of listing COMPONENTS and CHIP pins. |
204 | * of listing COMPONENTS and CHIP pins. |
| 205 | * / |
205 | * / |
| 206 | * |
206 | * |
| 207 | * Revision 1.27 96/12/13 08:43:06 08:43:06 mjames (Mike James) |
207 | * Revision 1.27 96/12/13 08:43:06 08:43:06 mjames (Mike James) |
| 208 | * Update to v5.1, added Write ID , exact routing |
208 | * Update to v5.1, added Write ID , exact routing |
| 209 | * |
209 | * |
| 210 | * Revision 1.26 96/08/06 13:37:05 13:37:05 mjames (Mike James) |
210 | * Revision 1.26 96/08/06 13:37:05 13:37:05 mjames (Mike James) |
| 211 | * Added FIX_LOCATION pin attribute to netlist |
211 | * Added FIX_LOCATION pin attribute to netlist |
| 212 | * |
212 | * |
| 213 | * Revision 1.25 96/07/19 14:38:39 14:38:39 mjames (Mike James) |
213 | * Revision 1.25 96/07/19 14:38:39 14:38:39 mjames (Mike James) |
| 214 | * Update to give to PRL |
214 | * Update to give to PRL |
| Line 279... | Line 279... | ||
| 279 | * Checkin before adding new command parsing to program |
279 | * Checkin before adding new command parsing to program |
| 280 | * |
280 | * |
| 281 | * Revision 1.1 96/01/10 13:13:51 13:13:51 mjames (Mike James) |
281 | * Revision 1.1 96/01/10 13:13:51 13:13:51 mjames (Mike James) |
| 282 | * Initial revision |
282 | * Initial revision |
| 283 | * |
283 | * |
| 284 | */ |
284 | */ |
| - | 285 | #include <stdio.h> |
|
| 285 | #include "printout.h" |
286 | #include <string.h> |
| - | 287 | #include <stdlib.h> |
|
| - | 288 | #include <ctype.h> |
|
| - | 289 | #include <time.h> |
|
| - | 290 | #include <regex.h> |
|
| 286 | 291 | ||
| 287 | #include "cmdlog.h" |
- | |
| 288 | #include "cmdparse.h" |
- | |
| 289 | #include "database.h" |
292 | #include "vertcl_main.h" |
| 290 | #include "equivalent.h" |
- | |
| 291 | #include "expression.h" |
293 | #include "expression.h" |
| 292 | #include "generic.h" |
294 | #include "generic.h" |
| - | 295 | #include "database.h" |
|
| - | 296 | #include "printout.h" |
|
| 293 | #include "print_vhdl.h" |
297 | #include "print_vhdl.h" |
| 294 | #include "print_vlog.h" |
298 | #include "print_vlog.h" |
| 295 | #include "sorting.h" |
299 | #include "sorting.h" |
| - | 300 | #include "cmdparse.h" |
|
| - | 301 | #include "cmdlog.h" |
|
| - | 302 | #include "equivalent.h" |
|
| 296 | #include "version.h" |
303 | #include "version.h" |
| 297 | #include "vertcl_main.h" |
- | |
| 298 | 304 | ||
| 299 | #include <ctype.h> |
- | |
| 300 | #include <regex.h> |
- | |
| 301 | #include <stdio.h> |
- | |
| 302 | #include <stdlib.h> |
- | |
| 303 | #include <string.h> |
- | |
| 304 | #include <time.h> |
- | |
| 305 | - | ||
| 306 | #ident \ |
- | |
| 307 | "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/printout.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $" |
305 | #ident "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/printout.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $" |
| 308 | 306 | ||
| 309 | /* decoding pin direction in ACF form */ |
307 | /* decoding pin direction in ACF form */ |
| 310 | /* see pindir_t in database.h */ |
308 | /* see pindir_t in database.h */ |
| 311 | static char *decode_pin[] = {"NONE", |
309 | static char * decode_pin[]= |
| - | 310 | { |
|
| - | 311 | "NONE", |
|
| 312 | "INPUT_PIN", |
312 | "INPUT_PIN", |
| 313 | "OUTPUT_PIN", |
313 | "OUTPUT_PIN", |
| 314 | "output_pin", /* buffer is a sort of Output pin (lower case is for |
314 | "output_pin", /* buffer is a sort of Output pin (lower case is for info only )*/ |
| 315 | info only )*/ |
- | |
| 316 | "BIDIR_PIN ", |
315 | "BIDIR_PIN ", |
| 317 | "CONFIG_PIN", |
316 | "CONFIG_PIN", |
| 318 | "POWER_PIN"}; |
317 | "POWER_PIN"}; |
| - | 318 | ||
| 319 | 319 | ||
| 320 | /* returns a valid pointer to a null string */ |
320 | /* returns a valid pointer to a null string */ |
| 321 | char *check_null_str (char *s) |
321 | char * check_null_str(char * s ) |
| 322 | { /* using shortcircuit evaluation rules here */ |
322 | { /* using shortcircuit evaluation rules here */ |
| 323 | if (!s || s[0] == 0 || strcmp (s, nullstr) == 0) |
323 | if(!s || s[0]==0 || strcmp(s,nullstr)==0) |
| 324 | return (nullstr); |
324 | return (nullstr); |
| 325 | else |
325 | else |
| 326 | return (s); |
326 | return(s); |
| 327 | } |
327 | } |
| 328 | 328 | ||
| - | 329 | ||
| - | 330 | ||
| - | 331 | ||
| 329 | /* ********************************************************************** */ |
332 | /* ********************************************************************** */ |
| 330 | 333 | ||
| 331 | /* this prints out the contents of the working database */ |
334 | /* this prints out the contents of the working database */ |
| 332 | /* prints a single net as a connection */ |
335 | /* prints a single net as a connection */ |
| 333 | /* subnets are printed as having the how_routed field of their |
336 | /* subnets are printed as having the how_routed field of their |
| 334 | parent, because this is the how_routed value that is indicated |
337 | parent, because this is the how_routed value that is indicated |
| 335 | by the routing */ |
338 | by the routing */ |
| 336 | 339 | ||
| 337 | void list_net_nodes (FILE *f, net_t *cnet, net_t *root_net) |
340 | void list_net_nodes(FILE * f,net_t * cnet,net_t * root_net) |
| 338 | { |
341 | { |
| 339 | noderef_t *bnode; |
342 | noderef_t * bnode; |
| 340 | node_t *cnode; |
343 | node_t * cnode; |
| 341 | int wrapc; |
344 | int wrapc ; |
| 342 | if (!cnet) |
345 | if(!cnet) |
| 343 | return; |
346 | return; |
| 344 | fprintf ( |
- | |
| 345 | f, |
- | |
| 346 | " CONNECTION \"%s\" \"%s\" %s; -- %d nodes\n ", |
347 | fprintf(f," CONNECTION \"%s\" \"%s\" %s; -- %d nodes\n ", |
| 347 | cnet->identifier, |
348 | cnet->identifier, |
| 348 | check_null_str (root_net->name), |
349 | check_null_str(root_net->name), |
| 349 | decode_how_routed[root_net->how_routed], |
350 | decode_how_routed[root_net->how_routed], |
| 350 | cnet->nodecount); |
351 | cnet->nodecount); |
| 351 | fprintf ( |
- | |
| 352 | f, |
- | |
| 353 | "-- partition port=%d in=%d need_buff=%d\n", |
352 | fprintf(f,"-- partition port=%d in=%d need_buff=%d\n", |
| 354 | cnet->leaves_partition, |
353 | cnet->leaves_partition, |
| 355 | cnet->inside_partition, |
354 | cnet->inside_partition, |
| 356 | cnet->needs_buff_sig); |
355 | cnet->needs_buff_sig); |
| 357 | if (cnet->vhdltype) |
356 | if (cnet->vhdltype) { |
| 358 | { |
- | |
| 359 | fprintf (f, "-- vhdl '"); |
357 | fprintf(f,"-- vhdl '"); |
| 360 | print_range_expression (f, cnet->vhdltype->expr, NO_RECURSE); |
358 | print_range_expression(f,cnet->vhdltype->expr,NO_RECURSE); |
| 361 | fprintf (f, "'\n"); |
359 | fprintf(f,"'\n"); |
| 362 | } |
360 | } |
| 363 | if (cnet->type_defined) |
361 | if (cnet->type_defined) |
| 364 | fprintf (f, "-- net type defined\n"); |
362 | fprintf(f,"-- net type defined\n"); |
| 365 | bnode = cnet->nodes; |
363 | bnode = cnet->nodes; |
| 366 | wrapc = 0; |
364 | wrapc = 0; |
| 367 | while (bnode) |
365 | while(bnode) { |
| 368 | { |
- | |
| 369 | cnode = bnode->node; |
366 | cnode=bnode->node; |
| 370 | fprintf (f, " %s(%s)", cnode->socket->identifier, cnode->identifier); |
367 | fprintf(f," %s(%s)",cnode->socket->identifier,cnode->identifier); |
| 371 | /* printout if any lines have fix_location flags set */ |
368 | /* printout if any lines have fix_location flags set */ |
| 372 | if (cnode->fix_location) |
369 | if(cnode->fix_location) { |
| 373 | { |
- | |
| 374 | wrapc += 2; /* cant get as much on this line */ |
370 | wrapc+=2; /* cant get as much on this line */ |
| 375 | fprintf (f, " FIX_LOCATION"); |
371 | fprintf(f," FIX_LOCATION"); |
| 376 | } |
372 | } |
| 377 | if (cnode->fixed_pin) |
373 | if(cnode->fixed_pin) { |
| 378 | { |
- | |
| 379 | wrapc += 2; /* cant get as much on this line */ |
374 | wrapc+=2; /* cant get as much on this line */ |
| 380 | fprintf (f, " %s", decode_pin[cnode->pindir]); |
375 | fprintf(f," %s",decode_pin[cnode->pindir]); |
| 381 | } |
376 | } |
| 382 | if (cnode->pin_group) |
377 | if(cnode->pin_group) { |
| 383 | { |
- | |
| 384 | wrapc += 2; /* cant get as much on this line */ |
378 | wrapc+=2; /* cant get as much on this line */ |
| 385 | fprintf (f, " (%d)", cnode->pin_group); |
379 | fprintf(f," (%d)",cnode->pin_group); |
| 386 | } |
380 | } |
| 387 | fprintf (f, ";"); |
381 | fprintf(f,";"); |
| 388 | 382 | ||
| 389 | wrapc++; |
383 | wrapc++; |
| 390 | if (wrapc >= 8) |
384 | if (wrapc>=8) |
| 391 | { |
385 | { |
| 392 | wrapc = 0; |
386 | wrapc=0; |
| 393 | fprintf (f, "\n "); |
387 | fprintf(f,"\n "); |
| 394 | } |
388 | } |
| 395 | bnode = bnode->next; |
389 | bnode = bnode->next; |
| 396 | }; |
390 | }; |
| 397 | if (wrapc) |
391 | if(wrapc) |
| 398 | fprintf (f, "\n "); |
392 | fprintf(f,"\n "); |
| 399 | fprintf (f, "END_CONN;\n"); |
393 | fprintf(f,"END_CONN;\n"); |
| 400 | } |
394 | } |
| 401 | 395 | ||
| 402 | /* ********************************************************************** */ |
396 | /* ********************************************************************** */ |
| 403 | void list_net_structure ( |
- | |
| 404 | FILE *f, net_t *cnet, net_t *root_net, int alias_depth, int flatten_jumpers) |
397 | void list_net_structure(FILE * f, net_t * cnet,net_t * root_net,int alias_depth,int flatten_jumpers) |
| 405 | { |
398 | { |
| 406 | net_t *subnet; |
399 | net_t * subnet; |
| 407 | subnet = cnet->subnets; |
400 | subnet = cnet->subnets; |
| 408 | if (cnet == root_net) |
401 | if(cnet==root_net) |
| 409 | fprintf (f, "--Top Level\n"); |
402 | fprintf(f,"--Top Level\n"); |
| 410 | if (cnet->how_joined == Jumpered && subnet) |
403 | if ( cnet->how_joined == Jumpered && subnet) { |
| 411 | { |
- | |
| 412 | fprintf ( |
- | |
| 413 | f, |
- | |
| 414 | "-- Jumpered Connections to '%s' name '%s' found here --\n", |
404 | fprintf(f,"-- Jumpered Connections to '%s' name '%s' found here --\n", |
| 415 | cnet->identifier, |
- | |
| 416 | cnet->name); |
405 | cnet->identifier,cnet->name); |
| 417 | if (flatten_jumpers == FLATTEN_JUMPERS) |
406 | if (flatten_jumpers == FLATTEN_JUMPERS) |
| 418 | list_net_nodes (f, cnet, root_net); |
407 | list_net_nodes(f,cnet,root_net); |
| 419 | 408 | ||
| 420 | else |
- | |
| 421 | while (subnet) |
409 | else while(subnet) { |
| 422 | { |
- | |
| 423 | list_net_structure ( |
- | |
| 424 | f, subnet, root_net, 0, flatten_jumpers); /* depth = 0, not |
410 | list_net_structure(f, subnet, root_net,0,flatten_jumpers); /* depth = 0, not aliased */ |
| 425 | aliased */ |
- | |
| 426 | subnet = subnet->joined_nets; |
411 | subnet = subnet->joined_nets; |
| 427 | } |
412 | } |
| 428 | fprintf (f, "--\n"); |
413 | fprintf(f,"--\n"); |
| 429 | } |
414 | } |
| 430 | else if (cnet->how_joined == Aliased && subnet) |
415 | else if ( cnet->how_joined == Aliased && subnet) { |
| 431 | { |
- | |
| 432 | fprintf (f, "-- Net nodes of aliased list here \n"); |
416 | fprintf(f,"-- Net nodes of aliased list here \n"); |
| 433 | list_net_nodes (f, cnet, root_net); |
417 | list_net_nodes(f,cnet,root_net); |
| 434 | fprintf ( |
- | |
| 435 | f, |
- | |
| 436 | "-- %*s '%s' (name %s) created by Alias of --\n", |
418 | fprintf(f,"-- %*s '%s' (name %s) created by Alias of --\n", |
| 437 | alias_depth, |
- | |
| 438 | "", |
- | |
| 439 | cnet->identifier, |
419 | alias_depth,"",cnet->identifier,cnet->name); |
| 440 | cnet->name); |
- | |
| 441 | while (subnet) |
420 | while(subnet){ |
| 442 | { |
- | |
| 443 | fprintf (f, "-- %*s '%s' -- \n", alias_depth, "", subnet->identifier); |
421 | fprintf(f,"-- %*s '%s' -- \n",alias_depth,"",subnet->identifier); |
| 444 | list_net_structure ( |
- | |
| 445 | f, subnet, root_net, alias_depth + 1, flatten_jumpers); |
422 | list_net_structure(f,subnet,root_net,alias_depth+1,flatten_jumpers); |
| 446 | subnet = subnet->joined_nets; |
423 | subnet = subnet->joined_nets; |
| 447 | } |
424 | } |
| 448 | fprintf (f, "--\n"); |
425 | fprintf(f,"--\n"); |
| 449 | } |
426 | } |
| 450 | else if (alias_depth == 0) |
427 | else if(alias_depth == 0) |
| 451 | list_net_nodes (f, cnet, root_net); |
428 | list_net_nodes(f,cnet,root_net); |
| - | 429 | ||
| 452 | } |
430 | } |
| 453 | 431 | ||
| - | 432 | ||
| 454 | /* ********************************************************************** */ |
433 | /* ********************************************************************** */ |
| 455 | /* lists all the connections on the board */ |
434 | /* lists all the connections on the board */ |
| 456 | void list_nets (FILE *f, net_t *cnet, int flatten_jumpers) |
435 | void list_nets(FILE * f,net_t * cnet,int flatten_jumpers) |
| 457 | { |
436 | { |
| 458 | while (cnet) |
437 | while(cnet) { |
| 459 | { |
- | |
| 460 | list_net_structure (f, cnet, cnet, 0, flatten_jumpers); |
438 | list_net_structure(f,cnet,cnet,0,flatten_jumpers); |
| 461 | cnet = cnet->next; |
439 | cnet = cnet->next; |
| 462 | } |
440 | } |
| 463 | } |
441 | } |
| 464 | 442 | ||
| - | 443 | ||
| 465 | /* ********************************************************************** */ |
444 | /* ********************************************************************** */ |
| 466 | 445 | ||
| 467 | static void list_join (FILE *f, char *typ, net_t *cnet) |
446 | static void list_join(FILE * f, char * typ, net_t * cnet) |
| 468 | { |
447 | { |
| 469 | int wrapc = 1; |
448 | int wrapc = 1; |
| 470 | /* printf("List join %s , cnet = %p, join_parent = %p , join_parent->id =%p\n", |
449 | /* printf("List join %s , cnet = %p, join_parent = %p , join_parent->id =%p\n", |
| 471 | typ,cnet,cnet->join_parent,cnet->join_parent->identifier); */ |
450 | typ,cnet,cnet->join_parent,cnet->join_parent->identifier); */ |
| 472 | fprintf (f, " %s %s = (", typ, cnet->join_parent->identifier); |
451 | fprintf(f," %s %s = (",typ,cnet->join_parent->identifier); |
| 473 | while (cnet) |
452 | while(cnet) { |
| 474 | { |
- | |
| 475 | if (cnet->external_node) |
453 | if(cnet->external_node) |
| 476 | fprintf ( |
- | |
| 477 | f, |
- | |
| 478 | "%s(%s); ", |
454 | fprintf(f,"%s(%s); ", |
| 479 | cnet->external_node->socket->identifier, |
455 | cnet->external_node->socket->identifier, |
| 480 | cnet->external_node->identifier); |
456 | cnet->external_node->identifier); |
| 481 | else |
457 | else |
| 482 | fprintf (f, "%s; ", cnet->identifier); |
458 | fprintf(f,"%s; ",cnet->identifier); |
| 483 | wrapc++; |
459 | wrapc++; |
| 484 | if (wrapc == 8) |
460 | if (wrapc==8) { |
| 485 | { |
461 | wrapc=0; |
| 486 | wrapc = 0; |
- | |
| 487 | fprintf (f, "\n "); |
462 | fprintf(f,"\n "); |
| 488 | } |
463 | } |
| 489 | cnet = cnet->joined_nets; |
464 | cnet = cnet->joined_nets; |
| 490 | } |
465 | } |
| 491 | fprintf (f, ");"); |
466 | fprintf(f,");"); |
| 492 | } |
467 | } |
| 493 | 468 | ||
| - | 469 | ||
| 494 | /* ********************************************************************** */ |
470 | /* ********************************************************************** */ |
| 495 | /* we are now one level down so it must be a join of some sort |
471 | /* we are now one level down so it must be a join of some sort |
| 496 | therefore join_parent is now valid */ |
472 | therefore join_parent is now valid */ |
| 497 | static void list_subnets (FILE *f, net_t *cnet, JoinMode_t join) |
473 | static void list_subnets(FILE * f,net_t * cnet,JoinMode_t join) |
| 498 | { |
474 | { |
| 499 | net_t *tnet = cnet; |
475 | net_t * tnet = cnet; |
| 500 | char *nettype; |
476 | char * nettype; |
| 501 | net_t *topname; |
477 | net_t * topname ; |
| 502 | 478 | ||
| 503 | while (tnet) |
479 | while(tnet) { |
| 504 | { |
- | |
| 505 | if (tnet->subnets) |
480 | if(tnet->subnets) |
| 506 | list_subnets (f, tnet->subnets, join); |
481 | list_subnets(f,tnet->subnets,join); |
| 507 | tnet = tnet->joined_nets; |
482 | tnet = tnet->joined_nets; |
| 508 | } |
483 | } |
| 509 | 484 | ||
| 510 | /* if we are interested in aliases, print these */ |
485 | /* if we are interested in aliases, print these */ |
| 511 | /* Or if we are interested in joins print these */ |
486 | /* Or if we are interested in joins print these */ |
| 512 | 487 | ||
| 513 | /* printf("id %s join_parent %p howjoin %d\n", |
488 | /* printf("id %s join_parent %p howjoin %d\n", |
| 514 | cnet->identifier,cnet->join_parent,cnet->how_joined); */ |
489 | cnet->identifier,cnet->join_parent,cnet->how_joined); */ |
| 515 | 490 | ||
| 516 | if (cnet->join_parent->how_joined == join) |
491 | if (cnet->join_parent->how_joined == join) { |
| 517 | { |
- | |
| 518 | switch (join) |
492 | switch(join) |
| 519 | { |
493 | { |
| 520 | case Aliased: |
- | |
| 521 | nettype = "ALIAS"; |
494 | case Aliased : nettype = "ALIAS"; break; |
| 522 | break; |
- | |
| 523 | case Jumpered: |
- | |
| 524 | nettype = "JUMPER"; |
495 | case Jumpered : nettype = "JUMPER";break; |
| 525 | break; |
- | |
| 526 | default: |
- | |
| 527 | nettype = "??"; |
496 | default : nettype = "??";break; |
| 528 | break; |
- | |
| 529 | }; |
497 | }; |
| 530 | list_join (f, nettype, cnet); |
498 | list_join( f, nettype, cnet); |
| 531 | 499 | ||
| 532 | topname = cnet; |
500 | topname = cnet; |
| 533 | /* ascend jumper hierarchy to get the real name */ |
501 | /* ascend jumper hierarchy to get the real name */ |
| 534 | while (topname->join_parent && ISNULLSTR (topname->name)) |
502 | while ( topname->join_parent && ISNULLSTR(topname->name)) |
| 535 | topname = topname->join_parent; |
503 | topname = topname->join_parent; |
| - | 504 | ||
| 536 | 505 | ||
| 537 | if (join != Aliased && !ISNULLSTR (topname->name)) |
506 | if (join != Aliased && !ISNULLSTR(topname->name) ) |
| 538 | fprintf (f, " -- signal '%s' \n", topname->name); |
507 | fprintf(f," -- signal '%s' \n",topname->name); |
| 539 | else |
508 | else |
| 540 | fprintf (f, "\n"); |
509 | fprintf(f,"\n"); |
| 541 | }; |
510 | }; |
| 542 | } |
511 | } |
| 543 | /* ********************************************************************** */ |
512 | /* ********************************************************************** */ |
| 544 | 513 | ||
| 545 | /* this lists all joined nets. it is recursive. Any subnets will be explored |
514 | /* this lists all joined nets. it is recursive. Any subnets will be explored |
| 546 | before printing out the joins for this net if any are presaent */ |
515 | before printing out the joins for this net if any are presaent */ |
| 547 | 516 | ||
| 548 | static void list_joined_nets (FILE *f, net_t *cnet) |
517 | static void list_joined_nets(FILE * f,net_t * cnet) |
| 549 | { |
518 | { |
| 550 | if (!cnet) |
- | |
| 551 | return; |
- | |
| 552 | 519 | ||
| 553 | while (cnet) |
520 | if(!cnet) |
| 554 | { |
521 | return; |
| - | 522 | ||
| - | 523 | ||
| - | 524 | while(cnet) { |
|
| 555 | /* if there are any subnets here, do the recursion on them */ |
525 | /* if there are any subnets here, do the recursion on them */ |
| 556 | /* printf("cnet = %p, subnets= %p \n",cnet,cnet->subnets); */ |
526 | /* printf("cnet = %p, subnets= %p \n",cnet,cnet->subnets); */ |
| 557 | if (cnet->subnets) |
527 | if(cnet->subnets) |
| 558 | { |
528 | { |
| 559 | list_subnets (f, cnet->subnets, Jumpered); |
529 | list_subnets(f,cnet->subnets,Jumpered); |
| 560 | } |
530 | } |
| 561 | if (cnet->vhdl_connect_net) |
531 | if(cnet->vhdl_connect_net) |
| 562 | { |
532 | { |
| 563 | fprintf ( |
- | |
| 564 | f, |
- | |
| 565 | " VHDL_CONN %s <= %s;\n", |
- | |
| 566 | cnet->name, |
- | |
| 567 | cnet->vhdl_connect_net->name); |
533 | fprintf(f," VHDL_CONN %s <= %s;\n",cnet->name,cnet->vhdl_connect_net->name); |
| 568 | } |
534 | } |
| 569 | cnet = cnet->next; |
535 | cnet = cnet->next; |
| 570 | } |
536 | } |
| - | 537 | ||
| 571 | } |
538 | } |
| 572 | 539 | ||
| 573 | /************************************************************************/ |
540 | /************************************************************************/ |
| 574 | 541 | ||
| 575 | static void list_routed_aliased_nets (FILE *f, net_t *cnet) |
542 | static void list_routed_aliased_nets(FILE * f,net_t * cnet) |
| 576 | { |
543 | { |
| 577 | if (!cnet) |
- | |
| 578 | return; |
- | |
| 579 | 544 | ||
| 580 | while (cnet) |
545 | if(!cnet) |
| 581 | { |
546 | return; |
| - | 547 | ||
| - | 548 | ||
| - | 549 | while(cnet) { |
|
| 582 | net_t *unrouted = cnet->unrouted_reference; |
550 | net_t * unrouted = cnet->unrouted_reference; |
| 583 | /* if there are any subnets here, do the recursion on them */ |
551 | /* if there are any subnets here, do the recursion on them */ |
| 584 | /* this will find out aliases if they exist */ |
552 | /* this will find out aliases if they exist */ |
| 585 | if (unrouted && unrouted->subnets) |
553 | if(unrouted && unrouted->subnets ) |
| 586 | list_subnets (f, unrouted->subnets, Aliased); |
554 | list_subnets(f,unrouted->subnets,Aliased); |
| 587 | cnet = cnet->next; |
555 | cnet = cnet->next; |
| 588 | } |
556 | } |
| - | 557 | ||
| 589 | } |
558 | } |
| 590 | 559 | ||
| 591 | /************************************************************************/ |
560 | /************************************************************************/ |
| 592 | 561 | ||
| 593 | static void list_aliased_nets (FILE *f, net_t *cnet) |
562 | static void list_aliased_nets(FILE * f,net_t * cnet) |
| 594 | { |
563 | { |
| 595 | if (!cnet) |
- | |
| 596 | return; |
- | |
| 597 | 564 | ||
| 598 | while (cnet) |
565 | if(!cnet) |
| 599 | { |
566 | return; |
| - | 567 | ||
| - | 568 | ||
| - | 569 | while(cnet) { |
|
| 600 | /* if there are any subnets here, do the recursion on them */ |
570 | /* if there are any subnets here, do the recursion on them */ |
| 601 | /* printf("cnet = %p, subnets= %p \n",cnet,cnet->subnets); */ |
571 | /* printf("cnet = %p, subnets= %p \n",cnet,cnet->subnets); */ |
| 602 | if (cnet->subnets) |
572 | if(cnet->subnets) |
| 603 | list_subnets (f, cnet->subnets, Aliased); |
573 | list_subnets(f,cnet->subnets,Aliased); |
| - | 574 | ||
| - | 575 | cnet = cnet->next; |
|
| - | 576 | } |
|
| 604 | 577 | ||
| 605 | cnet = cnet->next; |
- | |
| 606 | } |
- | |
| 607 | } |
578 | } |
| 608 | 579 | ||
| 609 | /************************************************************************/ |
580 | /************************************************************************/ |
| 610 | void list_components (FILE *f) |
581 | void list_components(FILE * f) |
| 611 | { |
582 | { |
| 612 | socket_t *cskt = sort_sockets (&socket_head); |
583 | socket_t * cskt = sort_sockets(&socket_head); |
| 613 | fprintf (f, "COMPONENTS\nBEGIN\n"); |
584 | fprintf(f,"COMPONENTS\nBEGIN\n"); |
| 614 | while (cskt) |
585 | while(cskt) { |
| 615 | { |
- | |
| 616 | if (cskt->is_template) |
586 | if(cskt->is_template) |
| 617 | fprintf (f, "-- %s : Socket Template\n", cskt->type); |
587 | fprintf(f,"-- %s : Socket Template\n", |
| 618 | else |
588 | cskt->type); |
| 619 | fprintf ( |
- | |
| 620 | f, |
589 | else |
| 621 | " %s : \"%s\" \"%s\" \"%s\"; -- %s\n", |
590 | fprintf(f," %s : \"%s\" \"%s\" \"%s\"; -- %s\n", |
| 622 | cskt->identifier, |
591 | cskt->identifier, |
| 623 | check_null_str (cskt->name), |
592 | check_null_str(cskt->name), |
| 624 | check_null_str (cskt->type), |
593 | check_null_str(cskt->type), |
| 625 | check_null_str (cskt->value), |
594 | check_null_str(cskt->value), |
| 626 | cskt->is_external ? "External" : "Internal"); |
595 | cskt->is_external ? "External" : "Internal"); |
| 627 | cskt = cskt->next; |
596 | cskt = cskt->next; |
| 628 | }; |
597 | }; |
| 629 | fprintf (f, "END;\n\n"); |
598 | fprintf(f,"END;\n\n"); |
| 630 | } |
599 | } |
| 631 | 600 | ||
| 632 | /***********************************************************************************/ |
601 | /***********************************************************************************/ |
| 633 | /* only list device info for those sockets which have "external" flags set */ |
602 | /* only list device info for those sockets which have "external" flags set */ |
| 634 | /* |
603 | /* |
| 635 | This is intended to provide Vertical write extern |
604 | This is intended to provide Vertical write extern |
| 636 | with an explicit tie-up between the socket ID |
605 | with an explicit tie-up between the socket ID |
| 637 | e.g. U1 and a device name in the socket e.g. BusChip or whatever. In fact in this |
606 | e.g. U1 and a device name in the socket e.g. BusChip or whatever. In fact in this |
| 638 | context the contents of socket U1 will be known as device name U1. |
607 | context the contents of socket U1 will be known as device name U1. |
| 639 | 608 | ||
| 640 | Without this info, the tool cannot locate sockets by name using the chip identifier |
609 | Without this info, the tool cannot locate sockets by name using the chip identifier |
| 641 | as ACF files do not contain the chip identifier, only the chip name. |
610 | as ACF files do not contain the chip identifier, only the chip name. |
| 642 | */ |
611 | */ |
| 643 | 612 | ||
| 644 | void list_extern_sockets (FILE *f) |
613 | void list_extern_sockets(FILE * f) |
| 645 | { |
614 | { |
| 646 | socket_t *cskt = sort_sockets (&socket_head); |
615 | socket_t * cskt = sort_sockets(&socket_head); |
| 647 | char *name; |
616 | char * name; |
| 648 | fprintf (f, "COMPONENTS\nBEGIN\n"); |
617 | fprintf(f,"COMPONENTS\nBEGIN\n"); |
| 649 | while (cskt) |
618 | while(cskt) { |
| 650 | { |
- | |
| 651 | if (cskt->is_external) |
619 | if(cskt->is_external) |
| 652 | { |
620 | { |
| 653 | /* force the device to have an identifier if it does not have one */ |
621 | /* force the device to have an identifier if it does not have one */ |
| 654 | name = cskt->name; |
622 | name = cskt->name; |
| 655 | if (ISNULLSTR (name)) |
623 | if (ISNULLSTR(name)) |
| 656 | name = cskt->identifier; |
624 | name = cskt->identifier; |
| 657 | 625 | ||
| 658 | fprintf ( |
- | |
| 659 | f, |
- | |
| 660 | " %s : \"%s\" \"%s\" \"%s\";\n", |
626 | fprintf(f," %s : \"%s\" \"%s\" \"%s\";\n", |
| 661 | cskt->identifier, |
627 | cskt->identifier, |
| 662 | name, |
628 | name, |
| 663 | check_null_str (cskt->type), |
629 | check_null_str(cskt->type), |
| 664 | check_null_str (cskt->value)); |
630 | check_null_str(cskt->value)); |
| 665 | } |
631 | } |
| 666 | cskt = cskt->next; |
632 | cskt = cskt->next; |
| 667 | }; |
633 | }; |
| 668 | fprintf (f, "END;\n\n"); |
634 | fprintf(f,"END;\n\n"); |
| 669 | } |
635 | } |
| 670 | 636 | ||
| - | 637 | ||
| - | 638 | ||
| 671 | /************************************************************************/ |
639 | /************************************************************************/ |
| 672 | void list_database (FILE *f, int flatten_jumpers) |
640 | void list_database(FILE * f,int flatten_jumpers) |
| 673 | { |
641 | { |
| 674 | list_components (f); |
642 | list_components(f); |
| - | 643 | ||
| - | 644 | fprintf(f,"WIRED_NETS\nBEGIN\n"); |
|
| - | 645 | fprintf(f,"-- Routed & Named nets follow --\n\nNAMED\n\n"); |
|
| - | 646 | list_nets(f,named_list,flatten_jumpers); |
|
| - | 647 | fprintf(f,"-- Routed & unused nets follow --\n\nROUTED\n\n"); |
|
| - | 648 | list_nets(f,routed_list,flatten_jumpers); |
|
| - | 649 | fprintf(f,"-- Unrouted nets follow --\n\nUNROUTED\n\n"); |
|
| - | 650 | list_nets(f,unrouted_list,flatten_jumpers); |
|
| - | 651 | fprintf(f,"END;\n\n"); |
|
| 675 | 652 | ||
| 676 | fprintf (f, "WIRED_NETS\nBEGIN\n"); |
- | |
| 677 | fprintf (f, "-- Routed & Named nets follow --\n\nNAMED\n\n"); |
- | |
| 678 | list_nets (f, named_list, flatten_jumpers); |
- | |
| 679 | fprintf (f, "-- Routed & unused nets follow --\n\nROUTED\n\n"); |
- | |
| 680 | list_nets (f, routed_list, flatten_jumpers); |
- | |
| 681 | fprintf (f, "-- Unrouted nets follow --\n\nUNROUTED\n\n"); |
- | |
| 682 | list_nets (f, unrouted_list, flatten_jumpers); |
- | |
| 683 | fprintf (f, "END;\n\n"); |
- | |
| 684 | } |
653 | } |
| 685 | /************************************************************************/ |
654 | /************************************************************************/ |
| 686 | void list_jumper (FILE *f) |
655 | void list_jumper(FILE * f) |
| 687 | { |
656 | { |
| 688 | fprintf (f, "-- Jumper list here --\n"); |
657 | fprintf(f,"-- Jumper list here --\n"); |
| 689 | fprintf (f, "JOINED_NETS\nBEGIN\n"); |
658 | fprintf(f,"JOINED_NETS\nBEGIN\n"); |
| 690 | 659 | ||
| 691 | fprintf (f, "-- named list\n"); |
660 | fprintf(f,"-- named list\n"); |
| 692 | list_joined_nets (f, named_list); |
661 | list_joined_nets(f,named_list); |
| 693 | fprintf (f, "-- routed list\n"); |
662 | fprintf(f,"-- routed list\n"); |
| 694 | list_joined_nets (f, routed_list); |
663 | list_joined_nets(f,routed_list); |
| 695 | fprintf (f, "END;\n\n"); |
664 | fprintf(f,"END;\n\n"); |
| 696 | } |
665 | } |
| 697 | 666 | ||
| 698 | /************************************************************************/ |
667 | /************************************************************************/ |
| 699 | void list_alias (FILE *f) |
668 | void list_alias(FILE * f) |
| 700 | { |
669 | { |
| 701 | fprintf (f, "-- Alias list here --\n"); |
670 | fprintf(f,"-- Alias list here --\n"); |
| 702 | fprintf (f, "JOINED_NETS\nBEGIN\n"); |
671 | fprintf(f,"JOINED_NETS\nBEGIN\n"); |
| 703 | fprintf (f, "-- named list\n"); |
672 | fprintf(f,"-- named list\n"); |
| 704 | list_routed_aliased_nets (f, named_list); |
673 | list_routed_aliased_nets(f,named_list); |
| 705 | fprintf (f, "-- routed list\n"); |
674 | fprintf(f,"-- routed list\n"); |
| 706 | list_routed_aliased_nets (f, routed_list); |
675 | list_routed_aliased_nets(f,routed_list); |
| 707 | fprintf (f, "-- unrouted list\n"); |
676 | fprintf(f,"-- unrouted list\n"); |
| 708 | list_aliased_nets (f, unrouted_list); |
677 | list_aliased_nets(f,unrouted_list); |
| 709 | fprintf (f, "END;\n\n"); |
678 | fprintf(f,"END;\n\n"); |
| 710 | } |
679 | } |
| 711 | 680 | ||
| - | 681 | ||
| 712 | /************************************************************************/ |
682 | /************************************************************************/ |
| 713 | void list_joined (FILE *f) |
683 | void list_joined(FILE * f) |
| 714 | { |
684 | { |
| 715 | /* and now the joined nets */ |
685 | /* and now the joined nets */ |
| - | 686 | ||
| - | 687 | fprintf(f,"JOINED_NETS\nBEGIN\n"); |
|
| 716 | 688 | ||
| - | 689 | fprintf(f,"-- Jumper list here --\n"); |
|
| - | 690 | list_joined_nets(f,named_list); |
|
| - | 691 | list_joined_nets(f,routed_list); |
|
| - | 692 | fprintf(f,"-- Alias list here --\n"); |
|
| - | 693 | list_routed_aliased_nets(f,named_list); |
|
| - | 694 | list_routed_aliased_nets(f,routed_list); |
|
| - | 695 | list_aliased_nets(f,unrouted_list); |
|
| 717 | fprintf (f, "JOINED_NETS\nBEGIN\n"); |
696 | fprintf(f,"END;\n\n"); |
| 718 | 697 | ||
| 719 | fprintf (f, "-- Jumper list here --\n"); |
- | |
| 720 | list_joined_nets (f, named_list); |
- | |
| 721 | list_joined_nets (f, routed_list); |
- | |
| 722 | fprintf (f, "-- Alias list here --\n"); |
- | |
| 723 | list_routed_aliased_nets (f, named_list); |
- | |
| 724 | list_routed_aliased_nets (f, routed_list); |
- | |
| 725 | list_aliased_nets (f, unrouted_list); |
- | |
| 726 | fprintf (f, "END;\n\n"); |
- | |
| 727 | } |
698 | } |
| 728 | 699 | ||
| 729 | /* ********************************************************************** */ |
700 | /* ********************************************************************** */ |
| 730 | /* if options & PRINT_ALL then print all known pins on the device */ |
701 | /* if options & PRINT_ALL then print all known pins on the device */ |
| 731 | /* if options & PRINT_TYPE then print the VHDL data type of this pin */ |
702 | /* if options & PRINT_TYPE then print the VHDL data type of this pin */ |
| Line 733... | Line 704... | ||
| 733 | /* if options & PRINT_EXPAND_BUS then expand out the VHDL bus to individual wires */ |
704 | /* if options & PRINT_EXPAND_BUS then expand out the VHDL bus to individual wires */ |
| 734 | /* if options & PRINT_GROUP then print out the pin groups */ |
705 | /* if options & PRINT_GROUP then print out the pin groups */ |
| 735 | /* if options & PRINT_ROUTE_FLAGS then print out the routing flags */ |
706 | /* if options & PRINT_ROUTE_FLAGS then print out the routing flags */ |
| 736 | /* if options & PRINT_AS_UNROUTED then printout "UNROUTED" instead of any pindir info */ |
707 | /* if options & PRINT_AS_UNROUTED then printout "UNROUTED" instead of any pindir info */ |
| 737 | /* if options & PRINT_EQUIVALENT_PINS then print the list of pin equivalents */ |
708 | /* if options & PRINT_EQUIVALENT_PINS then print the list of pin equivalents */ |
| 738 | void print_device (FILE *f, socket_t *dev, int options) |
709 | void print_device(FILE * f,socket_t * dev, int options) |
| 739 | { |
710 | { |
| 740 | node_t *n; |
711 | node_t * n; |
| 741 | char *vhdl_bus_format; |
712 | char * vhdl_bus_format; |
| 742 | 713 | ||
| 743 | generic_info_t gen[1]; |
- | |
| 744 | 714 | ||
| - | 715 | generic_info_t gen[1]; |
|
| - | 716 | ||
| 745 | /* sort all the nodes into alphabetical order */ |
717 | /* sort all the nodes into alphabetical order */ |
| 746 | sort_nodes (dev, NO_EXTRACT_XY); |
718 | sort_nodes(dev,NO_EXTRACT_XY); |
| - | 719 | ||
| - | 720 | /* if we are using VHDL then look at the VHDL bus formatting tail*/ |
|
| - | 721 | if ((options & PRINT_EXPAND_BUS) && |
|
| - | 722 | get_generic_value(&global_generics, "vhdl_bus_format",gen) == IS_ENV_VAL && gen->expr) |
|
| - | 723 | vhdl_bus_format = gen->expr->left.s; |
|
| - | 724 | else |
|
| - | 725 | vhdl_bus_format = "_%d_"; /* persuade GCC the string pointer is modifiable */ |
|
| - | 726 | ||
| - | 727 | ||
| - | 728 | ||
| - | 729 | /* if it hasnt got a name, use its identifier */ |
|
| - | 730 | ||
| - | 731 | if(!dev->is_template) { |
|
| - | 732 | if(dev->name != NULL && dev->name[0]) |
|
| - | 733 | fprintf(f,"CHIP %s\n",check_null_str(dev->name)); |
|
| - | 734 | else |
|
| - | 735 | fprintf(f,"CHIP %s\n",dev->identifier); |
|
| - | 736 | ||
| - | 737 | fprintf(f,"BEGIN\n DEVICE = \"%s\";\n",check_null_str(dev->type)); |
|
| - | 738 | if(options & PRINT_ROUTE_FLAGS && dev->route_flags) |
|
| - | 739 | fprintf(f," ROUTE_FLAGS = %d;\n",dev->route_flags); |
|
| - | 740 | ||
| - | 741 | if(dev->is_external) |
|
| - | 742 | fprintf(f,"-- External Connection\n\n"); |
|
| - | 743 | else |
|
| - | 744 | fprintf(f,"-- Internal Socket\n\n"); |
|
| - | 745 | ||
| - | 746 | ||
| - | 747 | fprintf(f,"-- DEV_IDENT \"%s\"\n",dev->identifier); |
|
| - | 748 | if(dev->highest_bundle) |
|
| - | 749 | { |
|
| - | 750 | fprintf(f,"-- Bundle of %d pins\n",dev->highest_bundle); |
|
| - | 751 | fprintf(f,"-- min_pin_row %d\n",dev->min_pin_row ); |
|
| - | 752 | fprintf(f,"-- max_pin_row %d\n",dev->max_pin_row ); |
|
| - | 753 | fprintf(f,"-- min_pin_col %d\n",dev->min_pin_col ); |
|
| - | 754 | fprintf(f,"-- max_pin_col %d\n",dev->max_pin_col ); |
|
| - | 755 | } |
|
| - | 756 | ||
| - | 757 | ||
| - | 758 | ||
| - | 759 | } |
|
| - | 760 | else { |
|
| - | 761 | fprintf(f,"TEMPLATE \"%s\"\n",check_null_str(dev->type)); |
|
| - | 762 | fprintf(f,"BEGIN\n"); |
|
| - | 763 | }; |
|
| - | 764 | ||
| - | 765 | if(options & PRINT_GENERIC && dev->generics) |
|
| - | 766 | list_generic_values(f,&dev->generics,2); |
|
| - | 767 | ||
| - | 768 | if ( dev->is_template && dev->parent_template_ref) { |
|
| - | 769 | fprintf(f," ALIAS \"%s\"\n",check_null_str(dev->parent_template_ref->type)); |
|
| - | 770 | n=NULL; /* alias templates have no nodes of their own */ |
|
| - | 771 | } |
|
| - | 772 | else |
|
| - | 773 | n=dev->nodes; |
|
| - | 774 | ||
| - | 775 | if(options & NO_PRINT_PINS) |
|
| - | 776 | n = NULL; |
|
| - | 777 | ||
| - | 778 | while(n) { |
|
| - | 779 | char tmp_name[MAXIDLEN],vhdltail[MAXIDLEN],group_tail[MAXIDLEN]; |
|
| - | 780 | int iter,iter_hi,iter_low; |
|
| - | 781 | vhdl_t * vhdl; |
|
| - | 782 | if( n->net_assigned || |
|
| - | 783 | (options &PRINT_ALL ) || |
|
| - | 784 | dev->is_template || |
|
| - | 785 | ((options & PRINT_NET_NAMES) && n->routed_net && !ISNULLSTR(n->routed_net->name))) { |
|
| - | 786 | /* there is a possibility here of printing |
|
| - | 787 | out a bus as separate signals */ |
|
| - | 788 | if(n->orig_vhdltype) /* if a pin rename has taken place, use the original name !! */ |
|
| - | 789 | vhdl= n->orig_vhdltype; |
|
| - | 790 | else |
|
| - | 791 | vhdl = n->vhdltype; |
|
| - | 792 | ||
| - | 793 | if((options&PRINT_EXPAND_BUS) && vhdl && vhdl->is_vector) { |
|
| - | 794 | fprintf(f,"-- Bus expansion follows '"); |
|
| - | 795 | decode_vhdl_bus(f,vhdl,NO_RECURSE); |
|
| - | 796 | fprintf(f,"'\n"); |
|
| - | 797 | eval_vhdl_expression(vhdl->expr,&iter_hi,&iter_low); |
|
| - | 798 | if(iter_hi<iter_low) { |
|
| - | 799 | int t; |
|
| - | 800 | fprintf(f,"-- VHDL Range is backwards !! \n"); |
|
| - | 801 | t = iter_hi; |
|
| - | 802 | iter_hi=iter_low; |
|
| - | 803 | iter_low=t; |
|
| - | 804 | }; |
|
| 747 | 805 | ||
| 748 | /* if we are using VHDL then look at the VHDL bus formatting tail*/ |
- | |
| 749 | if ((options & PRINT_EXPAND_BUS) && |
- | |
| 750 | get_generic_value (&global_generics, "vhdl_bus_format", gen) == IS_ENV_VAL && |
- | |
| 751 | gen->expr) |
- | |
| 752 | vhdl_bus_format = gen->expr->left.s; |
- | |
| 753 | else |
- | |
| 754 | vhdl_bus_format = "_%d_"; /* persuade GCC the string pointer is modifiable */ |
- | |
| 755 | - | ||
| 756 | /* if it hasnt got a name, use its identifier */ |
- | |
| 757 | - | ||
| 758 | if (!dev->is_template) |
- | |
| 759 | { |
- | |
| 760 | if (dev->name != NULL && dev->name[0]) |
- | |
| 761 | fprintf (f, "CHIP %s\n", check_null_str (dev->name)); |
- | |
| 762 | else |
- | |
| 763 | fprintf (f, "CHIP %s\n", dev->identifier); |
- | |
| 764 | - | ||
| 765 | fprintf (f, "BEGIN\n DEVICE = \"%s\";\n", check_null_str (dev->type)); |
- | |
| 766 | if (options & PRINT_ROUTE_FLAGS && dev->route_flags) |
- | |
| 767 | fprintf (f, " ROUTE_FLAGS = %d;\n", dev->route_flags); |
- | |
| 768 | - | ||
| 769 | if (dev->is_external) |
- | |
| 770 | fprintf (f, "-- External Connection\n\n"); |
- | |
| 771 | else |
- | |
| 772 | fprintf (f, "-- Internal Socket\n\n"); |
- | |
| 773 | - | ||
| 774 | fprintf (f, "-- DEV_IDENT \"%s\"\n", dev->identifier); |
- | |
| 775 | if (dev->highest_bundle) |
- | |
| 776 | { |
- | |
| 777 | fprintf (f, "-- Bundle of %d pins\n", dev->highest_bundle); |
- | |
| 778 | fprintf (f, "-- min_pin_row %d\n", dev->min_pin_row); |
- | |
| 779 | fprintf (f, "-- max_pin_row %d\n", dev->max_pin_row); |
- | |
| 780 | fprintf (f, "-- min_pin_col %d\n", dev->min_pin_col); |
- | |
| 781 | fprintf (f, "-- max_pin_col %d\n", dev->max_pin_col); |
- | |
| 782 | } |
- | |
| 783 | } |
806 | } |
| - | 807 | else { |
|
| - | 808 | iter_hi=0; |
|
| - | 809 | iter_low=0; |
|
| - | 810 | } |
|
| - | 811 | ||
| - | 812 | ||
| - | 813 | for(iter = iter_low; iter<= iter_hi;iter++) { |
|
| - | 814 | /* create a tail on the signal name */ |
|
| - | 815 | vhdltail[0] = '\0'; |
|
| - | 816 | if(vhdl && vhdl->is_vector) |
|
| - | 817 | sprintf(vhdltail,vhdl_bus_format,iter); /* this should be a template : setup in symbol table */ |
|
| - | 818 | ||
| - | 819 | ||
| - | 820 | if(options & PRINT_USABLE) { |
|
| - | 821 | if (n->routed_net) |
|
| - | 822 | sprintf(tmp_name,"\"%s%s\"",check_null_str(n->net->identifier),vhdltail); |
|
| - | 823 | else |
|
| - | 824 | sprintf(tmp_name,"\"unknown_net\""); |
|
| - | 825 | } |
|
| - | 826 | else if (options & PRINT_NET_NAMES ) /* signal assigned to net regardless of whether routed to this pin */ |
|
| - | 827 | { |
|
| - | 828 | if (n->net) |
|
| - | 829 | sprintf(tmp_name,"\"%s%s\"",check_null_str(n->net->name),vhdltail); |
|
| - | 830 | else if (n->routed_net) |
|
| - | 831 | sprintf(tmp_name,"\"%s%s\"",check_null_str(n->routed_net->name),vhdltail); |
|
| - | 832 | } |
|
| 784 | else |
833 | else |
| 785 | { |
834 | { |
| 786 | fprintf (f, "TEMPLATE \"%s\"\n", check_null_str (dev->type)); |
835 | sprintf(tmp_name,"\"%s%s\"",check_null_str(n->name),vhdltail); |
| 787 | fprintf (f, "BEGIN\n"); |
- | |
| 788 | }; |
836 | } |
| 789 | - | ||
| - | 837 | group_tail[0]='\0'; |
|
| 790 | if (options & PRINT_GENERIC && dev->generics) |
838 | if((options & PRINT_GROUP) && n->pin_group) |
| 791 | list_generic_values (f, &dev->generics, 2); |
839 | sprintf(group_tail,"(%d)", n->pin_group) ; |
| 792 | 840 | ||
| 793 | if (dev->is_template && dev->parent_template_ref) |
841 | fprintf(f," %-32s : ", |
| - | 842 | tmp_name); |
|
| 794 | { |
843 | |
| 795 | fprintf ( |
844 | |
| 796 | f, " ALIAS \"%s\"\n", check_null_str (dev->parent_template_ref->type)); |
- | |
| 797 | n = NULL; /* alias templates have no nodes of their own */ |
845 | if(options & PRINT_AS_UNROUTED) |
| 798 | } |
846 | fprintf(f,"UNROUTED "); |
| 799 | else |
847 | else |
| 800 | n = dev->nodes; |
848 | fprintf(f,"%s%s = %4s%s ", |
| 801 | - | ||
| 802 | if (options & NO_PRINT_PINS) |
849 | decode_pin[(int)n->pindir], |
| 803 | n = NULL; |
850 | group_tail, |
| 804 | - | ||
| 805 | while (n) |
- | |
| 806 | { |
- | |
| 807 | char tmp_name[MAXIDLEN], vhdltail[MAXIDLEN], group_tail[MAXIDLEN]; |
- | |
| 808 | int iter, iter_hi, iter_low; |
851 | n->identifier, |
| 809 | vhdl_t *vhdl; |
852 | vhdltail); |
| 810 | if (n->net_assigned || (options & PRINT_ALL) || dev->is_template || |
- | |
| 811 | ((options & PRINT_NET_NAMES) && n->routed_net && |
853 | if(options & PRINT_TYPE) { |
| 812 | !ISNULLSTR (n->routed_net->name))) |
- | |
| 813 | { |
- | |
| 814 | /* there is a possibility here of printing |
854 | if(!vhdl) /* VHDL base types only are printed here as |
| 815 | out a bus as separate signals */ |
855 | vectors are expanded */ |
| 816 | if (n->orig_vhdltype) /* if a pin rename has taken place, use the |
- | |
| 817 | original name !! */ |
- | |
| 818 | vhdl = n->orig_vhdltype; |
856 | fprintf(f," : %s",default_vhdl_datatype->basetype); |
| 819 | else |
857 | else |
| 820 | vhdl = n->vhdltype; |
858 | fprintf(f," : %s",vhdl->basetype); |
| 821 | - | ||
| 822 | if ((options & PRINT_EXPAND_BUS) && vhdl && vhdl->is_vector) |
- | |
| 823 | { |
- | |
| 824 | fprintf (f, "-- Bus expansion follows '"); |
- | |
| 825 | decode_vhdl_bus (f, vhdl, NO_RECURSE); |
- | |
| 826 | fprintf (f, "'\n"); |
- | |
| 827 | eval_vhdl_expression (vhdl->expr, &iter_hi, &iter_low); |
- | |
| 828 | if (iter_hi < iter_low) |
- | |
| 829 | { |
- | |
| 830 | int t; |
- | |
| 831 | fprintf (f, "-- VHDL Range is backwards !! \n"); |
- | |
| 832 | t = iter_hi; |
- | |
| 833 | iter_hi = iter_low; |
- | |
| 834 | iter_low = t; |
- | |
| 835 | }; |
- | |
| 836 | } |
859 | } |
| 837 | else |
- | |
| 838 | { |
- | |
| 839 | iter_hi = 0; |
- | |
| 840 | iter_low = 0; |
- | |
| 841 | } |
860 | |
| 842 | - | ||
| 843 | for (iter = iter_low; iter <= iter_hi; iter++) |
- | |
| 844 | { |
861 | |
| 845 | /* create a tail on the signal name */ |
- | |
| 846 | vhdltail[0] = '\0'; |
- | |
| 847 | if (vhdl && vhdl->is_vector) |
- | |
| 848 | sprintf ( |
- | |
| 849 | vhdltail, |
- | |
| 850 | vhdl_bus_format, |
- | |
| 851 | iter); /* this should be a template : setup in |
- | |
| 852 | symbol table */ |
- | |
| 853 | - | ||
| 854 | if (options & PRINT_USABLE) |
- | |
| 855 | { |
- | |
| 856 | if (n->routed_net) |
- | |
| 857 | sprintf ( |
- | |
| 858 | tmp_name, |
- | |
| 859 | "\"%s%s\"", |
- | |
| 860 | check_null_str (n->net->identifier), |
- | |
| 861 | vhdltail); |
- | |
| 862 | else |
- | |
| 863 | sprintf (tmp_name, "\"unknown_net\""); |
- | |
| 864 | } |
- | |
| 865 | else if (options & PRINT_NET_NAMES) /* signal assigned to net |
- | |
| 866 | regardless of whether |
- | |
| 867 | routed to this pin */ |
- | |
| 868 | { |
- | |
| 869 | if (n->net) |
- | |
| 870 | sprintf ( |
- | |
| 871 | tmp_name, |
- | |
| 872 | "\"%s%s\"", |
- | |
| 873 | check_null_str (n->net->name), |
- | |
| 874 | vhdltail); |
- | |
| 875 | else if (n->routed_net) |
- | |
| 876 | sprintf ( |
- | |
| 877 | tmp_name, |
- | |
| 878 | "\"%s%s\"", |
- | |
| 879 | check_null_str (n->routed_net->name), |
- | |
| 880 | vhdltail); |
- | |
| 881 | } |
- | |
| 882 | else |
- | |
| 883 | { |
- | |
| 884 | sprintf ( |
- | |
| 885 | tmp_name, |
- | |
| 886 | "\"%s%s\"", |
- | |
| 887 | check_null_str (n->name), |
- | |
| 888 | vhdltail); |
- | |
| 889 | } |
- | |
| 890 | group_tail[0] = '\0'; |
- | |
| 891 | if ((options & PRINT_GROUP) && n->pin_group) |
- | |
| 892 | sprintf (group_tail, "(%d)", n->pin_group); |
- | |
| 893 | - | ||
| 894 | fprintf (f, " %-32s : ", tmp_name); |
- | |
| 895 | - | ||
| 896 | if (options & PRINT_AS_UNROUTED) |
- | |
| 897 | fprintf (f, "UNROUTED "); |
- | |
| 898 | else |
- | |
| 899 | fprintf ( |
- | |
| 900 | f, |
- | |
| 901 | "%s%s = %4s%s ", |
- | |
| 902 | decode_pin[(int) n->pindir], |
- | |
| 903 | group_tail, |
- | |
| 904 | n->identifier, |
- | |
| 905 | vhdltail); |
- | |
| 906 | if (options & PRINT_TYPE) |
- | |
| 907 | { |
- | |
| 908 | if (!vhdl) /* VHDL base types only are printed here as |
- | |
| 909 | vectors are expanded */ |
- | |
| 910 | fprintf ( |
- | |
| 911 | f, |
- | |
| 912 | " : %s", |
- | |
| 913 | default_vhdl_datatype->basetype); |
- | |
| 914 | else |
- | |
| 915 | fprintf (f, " : %s", vhdl->basetype); |
- | |
| 916 | } |
- | |
| 917 | - | ||
| 918 | fprintf ( |
- | |
| 919 | f, |
- | |
| 920 | "; -- refs=%d %s %s %s\n", |
862 | fprintf(f,"; -- refs=%d %s %s %s\n", |
| 921 | n->refcount, |
863 | n->refcount, |
| 922 | n->fixed_pin ? "fixed" : "", |
864 | n->fixed_pin?"fixed":"", |
| 923 | n->in_use ? "in use" : "unused", |
865 | n->in_use?"in use":"unused", |
| 924 | n->net_assigned ? "net assigned" : ""); |
866 | n->net_assigned?"net assigned":""); |
| 925 | }; |
867 | }; |
| 926 | } |
868 | } |
| 927 | n = n->sktnext; /* traverse to next pin on socket */ |
869 | n=n->sktnext; /* traverse to next pin on socket */ |
| 928 | }; |
870 | }; |
| 929 | 871 | ||
| 930 | /* use routine in equivalent.c */ |
872 | /* use routine in equivalent.c */ |
| 931 | if (options & PRINT_EQUIVALENT_PINS) |
873 | if (options & PRINT_EQUIVALENT_PINS) |
| 932 | list_equivalent_pins (f, dev); |
874 | list_equivalent_pins(f,dev); |
| 933 | fprintf (f, "END;\n\n"); |
875 | fprintf(f,"END;\n\n"); |
| 934 | } |
876 | } |
| 935 | 877 | ||
| 936 | /************************************************************************/ |
878 | /************************************************************************/ |
| 937 | /* this function prints the 'entity' of a top level of a partition as an |
879 | /* this function prints the 'entity' of a top level of a partition as an |
| 938 | ACFP file */ |
880 | ACFP file */ |
| 939 | 881 | ||
| 940 | void print_ACF_entity (FILE *f, char *entityname) |
882 | void print_ACF_entity(FILE * f,char * entityname) |
| 941 | { |
883 | { |
| 942 | net_t *net = named_list; |
884 | net_t * net = named_list; |
| 943 | int pin_num = 1; |
885 | int pin_num = 1; |
| 944 | 886 | ||
| 945 | fprintf (f, "CHIP %s\n", entityname); |
887 | fprintf(f,"CHIP %s\n",entityname); |
| - | 888 | ||
| - | 889 | fprintf(f,"BEGIN\n DEVICE = \"VHDL-TOP\";\n"); |
|
| - | 890 | while(net){ |
|
| - | 891 | if(net->leaves_partition){ |
|
| - | 892 | char nam[MAXIDLEN]; |
|
| - | 893 | sprintf(nam,"\"%s\"",check_null_str(net->name)); |
|
| - | 894 | fprintf(f," %-32s : %5s = \"%d\" ", |
|
| - | 895 | nam, |
|
| - | 896 | decode_pin[(int)net->ext_dir], |
|
| - | 897 | pin_num++); |
|
| - | 898 | fprintf(f," : \""); |
|
| - | 899 | decode_vhdl_type(f,net->vhdltype,0); |
|
| - | 900 | fprintf(f,"\";\n"); |
|
| - | 901 | } |
|
| - | 902 | net=net->next; |
|
| - | 903 | } |
|
| - | 904 | fprintf(f,"END; -- %s\n\n",entityname); |
|
| 946 | 905 | ||
| 947 | fprintf (f, "BEGIN\n DEVICE = \"VHDL-TOP\";\n"); |
- | |
| 948 | while (net) |
- | |
| 949 | { |
- | |
| 950 | if (net->leaves_partition) |
- | |
| 951 | { |
- | |
| 952 | char nam[MAXIDLEN]; |
- | |
| 953 | sprintf (nam, "\"%s\"", check_null_str (net->name)); |
- | |
| 954 | fprintf ( |
- | |
| 955 | f, |
- | |
| 956 | " %-32s : %5s = \"%d\" ", |
- | |
| 957 | nam, |
- | |
| 958 | decode_pin[(int) net->ext_dir], |
- | |
| 959 | pin_num++); |
- | |
| 960 | fprintf (f, " : \""); |
- | |
| 961 | decode_vhdl_type (f, net->vhdltype, 0); |
- | |
| 962 | fprintf (f, "\";\n"); |
- | |
| 963 | } |
- | |
| 964 | net = net->next; |
- | |
| 965 | } |
- | |
| 966 | fprintf (f, "END; -- %s\n\n", entityname); |
- | |
| 967 | } |
906 | } |
| 968 | /************************************************************************/ |
907 | /************************************************************************/ |
| 969 | 908 | ||
| 970 | /* devices are always listed in acfp files with VHDL data types */ |
909 | /* devices are always listed in acfp files with VHDL data types */ |
| 971 | void list_devices (FILE *f, int listflags) |
910 | void list_devices(FILE * f,int listflags) |
| 972 | { |
911 | { |
| 973 | socket_t *dev; |
912 | socket_t * dev; |
| 974 | dev = socket_head; |
913 | dev = socket_head; |
| 975 | while (dev) |
914 | while(dev) |
| 976 | { |
915 | { |
| 977 | /* only print named devices !!! */ |
916 | /* only print named devices !!! */ |
| 978 | if (!ISNULLSTR (dev->name)) |
917 | if(!ISNULLSTR(dev->name)) |
| 979 | print_device (f, dev, listflags); |
918 | print_device(f,dev,listflags); |
| 980 | dev = dev->next; |
919 | dev = dev->next; |
| 981 | }; |
920 | }; |
| 982 | } |
921 | } |
| 983 | 922 | ||
| 984 | /************************************************************************/ |
923 | /************************************************************************/ |
| 985 | /* devices are always listed in acfp files with VHDL data types */ |
924 | /* devices are always listed in acfp files with VHDL data types */ |
| 986 | /* only those with their is_external flags set */ |
925 | /* only those with their is_external flags set */ |
| 987 | 926 | ||
| 988 | void list_extern_devices (FILE *f) |
927 | void list_extern_devices(FILE * f) |
| 989 | { |
928 | { |
| 990 | socket_t *dev; |
929 | socket_t * dev; |
| 991 | dev = socket_head; |
930 | dev = socket_head; |
| 992 | while (dev) |
931 | while(dev) |
| 993 | { |
932 | { |
| 994 | /* only print external devices !!! */ |
933 | /* only print external devices !!! */ |
| 995 | if (dev->is_external) |
934 | if(dev->is_external) |
| 996 | print_device (f, dev, PRINT_TYPE | PRINT_NET_NAMES); |
935 | print_device(f,dev,PRINT_TYPE | PRINT_NET_NAMES ); |
| 997 | dev = dev->next; |
936 | dev = dev->next; |
| 998 | }; |
937 | }; |
| 999 | } |
938 | } |
| 1000 | 939 | ||
| - | 940 | ||
| 1001 | /************************************************************************/ |
941 | /************************************************************************/ |
| 1002 | static int list_pin_renames (net_t *list, FILE *f, int any_renames_seen) |
942 | static int list_pin_renames(net_t * list,FILE * f,int any_renames_seen) { |
| 1003 | { |
- | |
| 1004 | noderef_t *nodes, *ref; |
943 | noderef_t * nodes ,* ref; |
| 1005 | 944 | ||
| 1006 | if (!list) |
- | |
| 1007 | return any_renames_seen; |
945 | if (!list) return any_renames_seen; |
| 1008 | while (list) |
946 | while(list) { |
| 1009 | { |
- | |
| 1010 | nodes = list->nodes; |
947 | nodes = list->nodes; |
| 1011 | 948 | ||
| 1012 | while (nodes) |
949 | while(nodes) { |
| 1013 | { |
- | |
| 1014 | ref = nodes->base_noderef; |
950 | ref = nodes->base_noderef; |
| 1015 | if (ref->orig_name) |
951 | if(ref->orig_name) { |
| 1016 | { |
- | |
| 1017 | if (!any_renames_seen) |
- | |
| 1018 | { /* overall, start the list if there is a rename */ |
952 | if(!any_renames_seen) { /* overall, start the list if there is a rename */ |
| 1019 | fprintf (f, "RENAME_PINS\n BEGIN\n"); |
953 | fprintf(f,"RENAME_PINS\n BEGIN\n"); |
| 1020 | any_renames_seen = 1; |
954 | any_renames_seen = 1; |
| 1021 | } |
955 | } |
| 1022 | if (ref->orig_vhdltype) |
956 | if(ref->orig_vhdltype){ |
| 1023 | { |
- | |
| 1024 | fprintf (f, " %s", list->identifier); |
957 | fprintf(f," %s",list->identifier); |
| 1025 | decode_vhdl_bus (f, ref->vhdltype, 0); |
958 | decode_vhdl_bus(f,ref->vhdltype,0); |
| 1026 | fprintf (f, " = ( "); |
959 | fprintf(f," = ( "); |
| 1027 | } |
960 | } |
| 1028 | else |
961 | else |
| 1029 | fprintf (f, " %s = ( ", list->identifier); |
962 | fprintf(f," %s = ( ",list->identifier); |
| 1030 | fprintf ( |
- | |
| 1031 | f, |
- | |
| 1032 | "%s.%s;);\n", |
- | |
| 1033 | ref->node->socket->identifier, |
963 | fprintf(f,"%s.%s;);\n",ref->node->socket->identifier,ref->orig_name); |
| 1034 | ref->orig_name); |
- | |
| 1035 | } |
- | |
| 1036 | nodes = nodes->next; |
- | |
| 1037 | } |
- | |
| 1038 | list = list->next; |
- | |
| 1039 | } |
964 | } |
| - | 965 | nodes = nodes->next; |
|
| - | 966 | } |
|
| - | 967 | list=list->next; |
|
| - | 968 | } |
|
| 1040 | return (any_renames_seen); |
969 | return(any_renames_seen); |
| - | 970 | } |
|
| - | 971 | ||
| - | 972 | ||
| - | 973 | /************************************************************************/ |
|
| - | 974 | ||
| - | 975 | void print_pin_renames(FILE * f){ |
|
| - | 976 | int any_renames_seen = 0; |
|
| - | 977 | fprintf(f,"-- pin renames on unrouted list follow --\n"); |
|
| - | 978 | list_pin_renames(unrouted_list,f,any_renames_seen); |
|
| - | 979 | fprintf(f,"-- pin renames on routed list follow --\n"); |
|
| - | 980 | any_renames_seen = list_pin_renames(routed_list,f,any_renames_seen); |
|
| - | 981 | fprintf(f,"-- pin renames on named list follow --\n"); |
|
| - | 982 | any_renames_seen = list_pin_renames(named_list,f,any_renames_seen); |
|
| - | 983 | if(any_renames_seen) |
|
| - | 984 | fprintf(f,"END;\n"); |
|
| 1041 | } |
985 | } |
| 1042 | 986 | ||
| 1043 | /************************************************************************/ |
987 | /************************************************************************/ |
| 1044 | 988 | ||
| 1045 | void print_pin_renames (FILE *f) |
- | |
| 1046 | { |
- | |
| 1047 | int any_renames_seen = 0; |
- | |
| 1048 | fprintf (f, "-- pin renames on unrouted list follow --\n"); |
- | |
| 1049 | list_pin_renames (unrouted_list, f, any_renames_seen); |
- | |
| 1050 | fprintf (f, "-- pin renames on routed list follow --\n"); |
- | |
| 1051 | any_renames_seen = list_pin_renames (routed_list, f, any_renames_seen); |
- | |
| 1052 | fprintf (f, "-- pin renames on named list follow --\n"); |
- | |
| 1053 | any_renames_seen = list_pin_renames (named_list, f, any_renames_seen); |
- | |
| 1054 | if (any_renames_seen) |
- | |
| 1055 | fprintf (f, "END;\n"); |
- | |
| 1056 | } |
- | |
| 1057 | 989 | ||
| 1058 | /************************************************************************/ |
- | |
| - | 990 | ||
| - | 991 | ||
| - | 992 | ||
| 1059 | 993 | ||
| 1060 | /************************************************************************/ |
994 | /************************************************************************/ |
| 1061 | /* and now for the FRB formatted stuff */ |
995 | /* and now for the FRB formatted stuff */ |
| 1062 | /* prints a frb formatted net */ |
996 | /* prints a frb formatted net */ |
| 1063 | void frb_list_net (FILE *f, net_t *cnet) |
997 | void frb_list_net(FILE * f,net_t * cnet) |
| 1064 | { |
998 | { |
| 1065 | noderef_t *bnode; |
999 | noderef_t * bnode; |
| 1066 | node_t *cnode; |
1000 | node_t * cnode; |
| 1067 | bnode = cnet->nodes; |
1001 | bnode = cnet->nodes; |
| 1068 | if (bnode) |
- | |
| 1069 | { /* only print out a net that has at leat one node on it */ |
1002 | if(bnode){ /* only print out a net that has at leat one node on it */ |
| 1070 | cnode = bnode->node; |
1003 | cnode=bnode->node; |
| 1071 | fprintf ( |
- | |
| 1072 | f, |
- | |
| 1073 | ".ADD_TER %s %s %s\n", |
1004 | fprintf(f,".ADD_TER %s %s %s\n", |
| 1074 | cnode->socket->identifier, |
1005 | cnode->socket->identifier, |
| 1075 | cnode->identifier, |
1006 | cnode->identifier, |
| 1076 | cnet->identifier); |
1007 | cnet->identifier); |
| 1077 | bnode = bnode->next; |
1008 | bnode = bnode->next; |
| 1078 | 1009 | ||
| 1079 | if (bnode) |
1010 | if(bnode) |
| 1080 | fprintf (f, ".TER\n"); |
1011 | fprintf(f,".TER\n"); |
| 1081 | while (bnode) |
- | |
| 1082 | { |
1012 | while(bnode) { |
| 1083 | cnode = bnode->node; |
1013 | cnode=bnode->node; |
| 1084 | fprintf (f, "%s %s\n", cnode->socket->identifier, cnode->identifier); |
1014 | fprintf(f,"%s %s\n",cnode->socket->identifier,cnode->identifier); |
| 1085 | bnode = bnode->next; |
1015 | bnode = bnode->next; |
| 1086 | }; |
1016 | }; |
| 1087 | fprintf (f, "\n"); |
1017 | fprintf(f,"\n"); |
| 1088 | }; |
1018 | }; |
| 1089 | } |
1019 | } |
| 1090 | 1020 | ||
| 1091 | /* ********************************************************************** */ |
1021 | /* ********************************************************************** */ |
| 1092 | 1022 | ||
| 1093 | /* only jumpered nets are permitted to be listed as separate physical nets*/ |
1023 | /* only jumpered nets are permitted to be listed as separate physical nets*/ |
| 1094 | /* aliased nets cannot, as they are asingle physical net */ |
1024 | /* aliased nets cannot, as they are asingle physical net */ |
| 1095 | void frb_list_net_connections (FILE *f, net_t *cnet) |
1025 | void frb_list_net_connections(FILE * f,net_t * cnet) |
| 1096 | { |
1026 | { |
| 1097 | while (cnet) |
1027 | while(cnet) { |
| 1098 | { |
- | |
| 1099 | net_t *subnet = cnet->subnets; |
1028 | net_t * subnet = cnet->subnets; |
| 1100 | if (subnet && cnet->how_joined == Jumpered) |
1029 | if(subnet && cnet->how_joined == Jumpered ) { |
| 1101 | { |
1030 | while(subnet) { |
| 1102 | while (subnet) |
- | |
| 1103 | { |
- | |
| 1104 | frb_list_net (f, subnet); |
1031 | frb_list_net (f,subnet); |
| 1105 | subnet = subnet->subnets; |
1032 | subnet = subnet->subnets; |
| 1106 | } |
1033 | } |
| 1107 | } |
1034 | } |
| 1108 | else |
1035 | else |
| 1109 | frb_list_net (f, cnet); |
1036 | frb_list_net (f,cnet); |
| 1110 | 1037 | ||
| 1111 | cnet = cnet->next; |
1038 | cnet=cnet->next; |
| 1112 | }; |
1039 | }; |
| 1113 | } |
1040 | } |
| 1114 | 1041 | ||
| 1115 | /* ********************************************************************** */ |
1042 | /* ********************************************************************** */ |
| 1116 | 1043 | ||
| 1117 | void produce_frb (FILE *f) |
1044 | void produce_frb(FILE * f) |
| 1118 | 1045 | ||
| 1119 | { |
1046 | { |
| 1120 | time_t now; |
1047 | time_t now; |
| 1121 | struct tm *tim; |
1048 | struct tm * tim; |
| 1122 | 1049 | ||
| 1123 | socket_t *dev; |
1050 | socket_t * dev; |
| 1124 | 1051 | ||
| 1125 | time (&now); |
1052 | time( &now); |
| 1126 | tim = localtime (&now); |
1053 | tim =localtime(&now); |
| 1127 | 1054 | ||
| 1128 | fprintf ( |
- | |
| 1129 | f, |
- | |
| 1130 | ".HEA\n.TIM %4d %02d %02d %02d %02d %02d\n", |
1055 | fprintf(f,".HEA\n.TIM %4d %02d %02d %02d %02d %02d\n", |
| 1131 | tim->tm_year + 1900, |
1056 | tim->tm_year+1900, |
| 1132 | tim->tm_mon + 1, /* tm_mon has range 0..11 (jan=0) */ |
1057 | tim->tm_mon+1, /* tm_mon has range 0..11 (jan=0) */ |
| 1133 | tim->tm_mday, /* but tm_mday has range 1..31 !! */ |
1058 | tim->tm_mday, /* but tm_mday has range 1..31 !! */ |
| 1134 | tim->tm_hour, |
1059 | tim->tm_hour, |
| 1135 | tim->tm_min, |
1060 | tim->tm_min, |
| 1136 | tim->tm_sec); |
1061 | tim->tm_sec); |
| - | 1062 | ||
| 1137 | 1063 | ||
| 1138 | fprintf (f, ".JOB J_%d\n", (int) now); |
1064 | fprintf(f,".JOB J_%d\n",(int)now); |
| 1139 | 1065 | ||
| 1140 | fprintf (f, ".TYP FULL\n"); |
1066 | fprintf(f,".TYP FULL\n"); |
| 1141 | fprintf (f, ".APP \"Neutral Architecture File\"\n\n"); |
1067 | fprintf(f,".APP \"Neutral Architecture File\"\n\n"); |
| 1142 | - | ||
| 1143 | dev = socket_head; |
- | |
| 1144 | while (dev) |
- | |
| 1145 | { |
- | |
| 1146 | /* only print named devices !!! */ |
- | |
| 1147 | fprintf (f, ".ADD_COM %s %s %s\n", dev->identifier, dev->type, dev->value); |
- | |
| 1148 | dev = dev->next; |
- | |
| 1149 | } |
- | |
| 1150 | fprintf (f, "\n\n"); |
- | |
| 1151 | 1068 | ||
| 1152 | frb_list_net_connections (f, named_list); |
- | |
| 1153 | frb_list_net_connections (f, routed_list); |
- | |
| 1154 | 1069 | ||
| - | 1070 | dev = socket_head; |
|
| - | 1071 | while(dev) { |
|
| - | 1072 | /* only print named devices !!! */ |
|
| - | 1073 | fprintf(f,".ADD_COM %s %s %s\n", |
|
| - | 1074 | dev->identifier, |
|
| - | 1075 | dev->type, |
|
| - | 1076 | dev->value); |
|
| - | 1077 | dev = dev->next; |
|
| - | 1078 | } |
|
| - | 1079 | fprintf(f,"\n\n"); |
|
| - | 1080 | ||
| - | 1081 | frb_list_net_connections(f,named_list); |
|
| - | 1082 | frb_list_net_connections(f,routed_list); |
|
| - | 1083 | ||
| 1155 | fprintf (f, ".END\n"); |
1084 | fprintf(f,".END\n"); |
| - | 1085 | ||
| 1156 | } |
1086 | } |
| 1157 | 1087 | ||
| 1158 | /* ********************************************************************** */ |
1088 | /* ********************************************************************** */ |
| 1159 | #if defined PC |
1089 | #if defined PC |
| 1160 | #define FMT1STR " Produced by %s (PC-CygWin)\n" |
1090 | #define FMT1STR " Produced by %s (PC-CygWin)\n" |
| 1161 | #define FMT2STR " at %02d:%02d:%02d on %02d/%02d/%4d \n\n" |
1091 | #define FMT2STR " at %02d:%02d:%02d on %02d/%02d/%4d \n\n" |
| 1162 | #else |
1092 | #else |
| 1163 | #define FMT1STR " Produced by %s (HPUX)\n" |
1093 | #define FMT1STR " Produced by %s (HPUX)\n" |
| 1164 | #define FMT2STR " at %02d:%02d:%02d on %02d/%02d/%4d \n\n" |
1094 | #define FMT2STR " at %02d:%02d:%02d on %02d/%02d/%4d \n\n" |
| 1165 | #endif |
1095 | #endif |
| 1166 | 1096 | ||
| 1167 | #define VHDL_FMTSTR "--" FMT1STR "--" FMT2STR |
1097 | #define VHDL_FMTSTR "--" FMT1STR "--" FMT2STR |
| 1168 | #define VLOG_FMTSTR "/*" FMT1STR " *" FMT2STR "*/" |
1098 | #define VLOG_FMTSTR "/*" FMT1STR " *" FMT2STR "*/" |
| 1169 | 1099 | ||
| 1170 | /* puts a comment on the head of the file */ |
1100 | /* puts a comment on the head of the file */ |
| 1171 | void print_header (FILE *f, char *tool) |
1101 | void print_header(FILE * f,char * tool) |
| 1172 | 1102 | ||
| 1173 | { |
1103 | { |
| 1174 | time_t now; |
1104 | time_t now; |
| 1175 | struct tm *tim; |
1105 | struct tm * tim; |
| - | 1106 | ||
| - | 1107 | ||
| - | 1108 | time( &now); |
|
| - | 1109 | tim =localtime(&now); |
|
| - | 1110 | fprintf(f,"-- FPGA / EPLD / PCB / VHDL tools --\n"); |
|
| - | 1111 | fprintf(f,"-- NFL Technologies 1995-2003 --\n\n"); |
|
| - | 1112 | fprintf(f,"-- by: Mike James \n\n"); |
|
| - | 1113 | fprintf(f,"-- package version: %s compiled: %s--\n\n",Vertical_Version ,Vertical_Time); |
|
| - | 1114 | fprintf(f,VHDL_FMTSTR, |
|
| - | 1115 | tool, |
|
| - | 1116 | tim->tm_hour, |
|
| - | 1117 | tim->tm_min, |
|
| - | 1118 | tim->tm_sec, |
|
| - | 1119 | tim->tm_mday, |
|
| - | 1120 | tim->tm_mon+1, |
|
| - | 1121 | tim->tm_year+1900); |
|
| - | 1122 | ||
| 1176 | 1123 | ||
| 1177 | time (&now); |
- | |
| 1178 | tim = localtime (&now); |
- | |
| 1179 | fprintf (f, "-- FPGA / EPLD / PCB / VHDL tools --\n"); |
- | |
| 1180 | fprintf (f, "-- NFL Technologies 1995-2003 --\n\n"); |
- | |
| 1181 | fprintf (f, "-- by: Mike James \n\n"); |
- | |
| 1182 | fprintf ( |
- | |
| 1183 | f, "-- package version: %s compiled: %s--\n\n", Vertical_Version, Vertical_Time); |
- | |
| 1184 | fprintf ( |
- | |
| 1185 | f, |
- | |
| 1186 | VHDL_FMTSTR, |
- | |
| 1187 | tool, |
- | |
| 1188 | tim->tm_hour, |
- | |
| 1189 | tim->tm_min, |
- | |
| 1190 | tim->tm_sec, |
- | |
| 1191 | tim->tm_mday, |
- | |
| 1192 | tim->tm_mon + 1, |
- | |
| 1193 | tim->tm_year + 1900); |
- | |
| 1194 | } |
1124 | } |
| 1195 | 1125 | ||
| - | 1126 | ||
| 1196 | /* puts a comment on the head of the file */ |
1127 | /* puts a comment on the head of the file */ |
| 1197 | void print_VLOG_header (FILE *f, char *tool) |
1128 | void print_VLOG_header(FILE * f,char * tool) |
| 1198 | 1129 | ||
| 1199 | { |
1130 | { |
| 1200 | time_t now; |
1131 | time_t now; |
| 1201 | struct tm *tim; |
1132 | struct tm * tim; |
| - | 1133 | ||
| - | 1134 | ||
| - | 1135 | time( &now); |
|
| - | 1136 | tim =localtime(&now); |
|
| - | 1137 | fprintf(f,"/* FPGA / EPLD / PCB / VHDL tools */\n"); |
|
| - | 1138 | fprintf(f,"/* NFL Technologies 1995-2003 --\n\n */"); |
|
| - | 1139 | fprintf(f,"/* by: Mike James \n\n */"); |
|
| - | 1140 | fprintf(f,"/* package version: %s compiled: %s*/\n\n",Vertical_Version ,Vertical_Time); |
|
| - | 1141 | fprintf(f,VLOG_FMTSTR, |
|
| - | 1142 | tool, |
|
| - | 1143 | tim->tm_hour, |
|
| - | 1144 | tim->tm_min, |
|
| - | 1145 | tim->tm_sec, |
|
| - | 1146 | tim->tm_mday, |
|
| - | 1147 | tim->tm_mon+1, |
|
| - | 1148 | tim->tm_year+1900); |
|
| - | 1149 | ||
| 1202 | 1150 | ||
| 1203 | time (&now); |
- | |
| 1204 | tim = localtime (&now); |
- | |
| 1205 | fprintf (f, "/* FPGA / EPLD / PCB / VHDL tools */\n"); |
- | |
| 1206 | fprintf (f, "/* NFL Technologies 1995-2003 --\n\n */"); |
- | |
| 1207 | fprintf (f, "/* by: Mike James \n\n */"); |
- | |
| 1208 | fprintf ( |
- | |
| 1209 | f, "/* package version: %s compiled: %s*/\n\n", Vertical_Version, Vertical_Time); |
- | |
| 1210 | fprintf ( |
- | |
| 1211 | f, |
- | |
| 1212 | VLOG_FMTSTR, |
- | |
| 1213 | tool, |
- | |
| 1214 | tim->tm_hour, |
- | |
| 1215 | tim->tm_min, |
- | |
| 1216 | tim->tm_sec, |
- | |
| 1217 | tim->tm_mday, |
- | |
| 1218 | tim->tm_mon + 1, |
- | |
| 1219 | tim->tm_year + 1900); |
- | |
| 1220 | } |
1151 | } |
| - | 1152 | ||
| - | 1153 | ||