Subversion Repositories Vertical

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/*
2
 * $Id: printout.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $
3
 *
4
 * $Log: printout.c,v $
5
 * Revision 1.1.1.1  2003/11/04 23:34:57  mjames
6
 * Imported into local repositrory
7
 *
8
 * Revision 1.18  2002/09/27 22:32:07  MJAMES
9
 * Added comments to make pin renames easier to find again
10
 *
11
 * Revision 1.17  2002/09/09 10:11:01  mjames
12
 * Moved pin remapping function to pin ident editing function from
13
 * sorting pin name routine.
14
 *
15
 * Revision 1.16  2002/08/06 12:52:33  mjames
16
 * Merge in from latest version
17
 *
18
 * Revision 1.18  2002/08/06 08:51:49  mjames
19
 * Removed mention of Altera from banner printed at top of files.
20
 *
21
 * Revision 1.17  2002/04/10 14:29:10  mjames
22
 * Moved setting debug level to cmdutil.c
23
 *
24
 * Amended print external command to list all net names on socket pins
25
 * whether routed or not.
26
 *
27
 * Revision 1.16  2002/03/08 11:49:00  mjames
28
 * Corrected an error involving accessing strings via a null pointer when printing
29
 * a list of sockets.
30
 *
31
 * Revision 1.15  2002/01/03 16:36:10  mjames
32
 * Method of accessing Vertical version changed to avoid
33
 * global variable
34
 *
35
 * Revision 1.14  2001/12/13 22:15:38  mjames
36
 * Using #ident with header to identify file
37
 *
38
 * Revision 1.13  2001/11/30 22:16:14  mjames
39
 * Printout of aliased templates has been corrected as the target alias
40
 * type was not being printed.
41
 *
42
 * Revision 1.12  2001/11/01 11:02:55  mjames
43
 * Removed unused variables.
44
 * Allowed acf files to print device pinouts : this had failed because
45
 * a && b was written where a & b was meant !
46
 *
47
 * Revision 1.11  2001/10/31 22:20:14  mjames
48
 * Tidying up problematical comments caused by CVS
49
 * 'intelligent' comment guessing
50
 *
51
 * Revision 1.10  2001/10/22 10:55:18  mjames
52
 * Gives pin index min/max row/col as comments in component declarations
53
 *
54
 * Revision 1.9  2001/10/11 16:10:17  mjames
55
 * Corrections to the SWAP command, and printout so that
56
 * WRITE net now outputs all chips in the design so that their generics
57
 * can be passed forward to the next phase.
58
 *
59
 * Revision 1.8  2001/10/10 20:18:22  mjames
60
 * Added a vert_regcomp function to compile regular expressions
61
 * with '^' (match start string) and  '$' (match end string) bracketing
62
 * this => wildcard must match entire string not just a part of it.
63
 *
64
 * Revision 1.7  2001/08/31 09:38:43  mjames
65
 * Added a comment about the printing of equivalent pins being enabled by a flag
66
 *
67
 * Revision 1.6  2001/07/09 15:38:29  mjames
68
 * Placed the version string in an independent file to save time on building
69
 * all of the variants of Vertical
70
 *
71
 * Revision 1.5  2001/07/09 10:05:27  mjames
72
 * Placed the version string in an independent file to save time on building
73
 * all of the variants of Vertical
74
 *
75
 * Revision 1.4  2001/06/06 12:10:18  mjames
76
 * Move from HPUX
77
 *
78
 * Revision 1.3  2000/11/29 21:51:19  mjames
79
 * Fine tuning of software
80
 *
81
 * Revision 1.2  2000/10/21 20:41:29  mjames
82
 * Added the 'write flatten' command that only lists the wires
83
 * created by making jumpered connections rather than listing
84
 * the jumpers themselves
85
 *
86
 * Revision 1.1.1.1  2000/10/19 21:58:39  mjames
87
 * Mike put it here
88
 *
89
 *
90
 * Revision 1.68  2000/10/04  10:37:08  10:37:08  mjames (Mike James)
91
 * Modified for Vertical2 : support COMPONENTS and SIGNALS
92
 *
93
 * Revision 1.68  2000/10/04  10:37:08  10:37:08  mjames (Mike James)
94
 * Part of Release PSAVAT01
95
 *
96
 * Revision 1.67  2000/10/02  11:04:18  11:04:18  mjames (Mike James)
97
 * new_vhdl
98
 *
99
 * Revision 1.66  2000/09/27  14:42:19  14:42:19  mjames (Mike James)
100
 * Part of Release Sep_27_ST_2000
101
 *
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.
104
 *
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
107
 * printing.
108
 * ,.
109
 *
110
 * Revision 1.63  2000/09/21  10:15:49  10:15:49  mjames (Mike James)
111
 * Part of Release Sep21Alpha
112
 *
113
 * Revision 1.62  2000/09/21  09:47:19  09:47:19  mjames (Mike James)
114
 * Added code to deal with pin equivalents
115
 *
116
 * Revision 1.61  2000/08/25  09:57:15  09:57:15  mjames (Mike James)
117
 * Part of Release Aug25_alpha
118
 *
119
 * Revision 1.60  2000/08/16  08:57:31  08:57:31  mjames (Mike James)
120
 * Part of Release CD01_Aug2000
121
 *
122
 * Revision 1.59  2000/08/14  14:45:12  14:45:12  mjames (Mike James)
123
 * Part of Release Aug_14_2000
124
 *
125
 * Revision 1.58  2000/08/14  14:43:29  14:43:29  mjames (Mike James)
126
 * Added power pins
127
 *
128
 * Revision 1.57  2000/08/11  08:30:32  08:30:32  mjames (Mike James)
129
 * Part of Release Aug_11_2000
130
 *
131
 * Revision 1.56  2000/08/09  10:31:47  10:31:47  mjames (Mike James)
132
 * Part of Release Aug__9_2000
133
 *
134
 * Revision 1.55  2000/05/31  11:42:57  11:42:57  mjames (Mike James)
135
 * Part of Release May_31_2000
136
 *
137
 * Revision 1.54  2000/05/08  17:01:38  17:01:38  mjames (Mike James)
138
 * Part of Release May__8_2000
139
 *
140
 * Revision 1.53  2000/05/08  16:59:31  16:59:31  mjames (Mike James)
141
 * Part of Release May__8_2000
142
 *
143
 * Revision 1.52  2000/05/08  16:57:08  16:57:08  mjames (Mike James)
144
 * Part of Release May__8_2000
145
 *
146
 * Revision 1.51  2000/03/08  16:19:24  16:19:24  mjames (Mike James)
147
 * New version including PC
148
 *
149
 * Revision 1.48  2000/02/18  15:45:44  15:45:44  mjames (Mike James)
150
 * Amended to support PC
151
 *
152
 * Revision 1.47  2000/01/20  15:58:48  15:58:48  mjames (Mike James)
153
 * Part of Release R22
154
 *
155
 * Revision 1.46  99/12/22  11:15:28  11:15:28  mjames (Mike James)
156
 * Part of Release Dec_22_1999
157
 *
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
160
 * file
161
 *
162
 * Revision 1.40  98/11/27  15:15:48  15:15:48  mjames (Mike James)
163
 * Altered listing of jumpers
164
 *
165
 * Revision 1.39  98/11/16  13:18:36  13:18:36  mjames (Mike James)
166
 *
167
 * Revision 1.38  98/08/12  14:21:57  14:21:57  mjames (Mike James)
168
 * COrrected VHDL printout
169
 *
170
 * Revision 1.37  98/07/14  13:25:38  13:25:38  mjames (Mike James)
171
 * Altered device printout to meet new requirements
172
 *
173
 * Revision 1.36  98/06/15  14:19:01  14:19:01  mjames (Mike James)
174
 * Added template printout functionality
175
 *
176
 * Revision 1.35  98/04/24  13:49:16  13:49:16  mjames (Mike James)
177
 * Avoid priting 'generics' for chips without them
178
 *
179
 * Revision 1.34  98/03/16  11:37:55  11:37:55  mjames (Mike James)
180
 * Added generics to printout listings
181
 *
182
 * Revision 1.33  98/02/11  11:27:01  11:27:01  mjames (Mike James)
183
 * Checked in for version 6.2a
184
 *
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
187
 * containing $ENT$ and $ARCH$ in the position where one
188
 * wants the entity and architecture to be given.
189
 *
190
 * Revision 1.31  97/04/23  08:43:21  08:43:21  mjames (Mike James)
191
 * CHecked in for release rel23041997
192
 *
193
 * Revision 1.30  96/12/23  15:19:14  15:19:14  mjames (Mike James)
194
 * Altered headline for UMA email address
195
 *
196
 * Revision 1.29  96/12/23  15:12:52  15:12:52  mjames (Mike James)
197
 * Fixing printout routines to work with templates
198
 * (somewhat unecessary as they are on a different linked list
199
 * to the sockets which was causing problems until I saw
200
 * the mistake.
201
 *
202
 * Revision 1.28  96/12/23  10:23:33  10:23:33  mjames (Mike James)
203
 * Altered to make it sort the results
204
 * of listing COMPONENTS and CHIP pins.
205
 * /
206
 *
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
209
 *
210
 * Revision 1.26  96/08/06  13:37:05  13:37:05  mjames (Mike James)
211
 * Added FIX_LOCATION pin attribute to netlist
212
 *
213
 * Revision 1.25  96/07/19  14:38:39  14:38:39  mjames (Mike James)
214
 * Update to give to PRL
215
 *
216
 * Revision 1.24  1996/07/12  15:52:12  mjames
217
 * Sorted out things like Alias and Jumpers
218
 * Work Correctly
219
 * Print COrrectly
220
 *
221
 * Revision 1.23  96/07/09  15:53:39  15:53:39  mjames (Mike James)
222
 * Altered aliasing to make it hierarchical, also for jumpering
223
 *
224
 * Revision 1.22  96/06/17  11:02:24  11:02:24  mjames (Mike James)
225
 * Altered the printing of JUMPERED and ALIASED nets
226
 * ,
227
 *
228
 * Revision 1.21  96/06/11  14:16:48  14:16:48  mjames (Mike James)
229
 * Removed a spurios printf.
230
 *
231
 * Revision 1.20  96/06/11  14:11:22  14:11:22  mjames (Mike James)
232
 * Added hierarchical jumpering
233
 *
234
 * Revision 1.19  96/06/10  13:26:00  13:26:00  mjames (Mike James)
235
 * Checkin before altering joined/subnet behaviour
236
 *
237
 * Revision 1.18  96/06/04  11:53:11  11:53:11  mjames (Mike James)
238
 * Added the ability to jumper nets by reference to a node on the nets
239
 *
240
 * Revision 1.17  96/05/21  14:13:53  14:13:53  mjames (Mike James)
241
 * Altered printout decode_pin[] array as I have fixed buffer_pins
242
 * so that they are beginning to work.
243
 *
244
 * Revision 1.16  96/04/26  16:02:23  16:02:23  mjames (Mike James)
245
 * Altered inside/outside determination of signal directions
246
 *
247
 * Revision 1.15  96/04/15  14:19:33  14:19:33  mjames (Mike James)
248
 * Checkin before datatype printing
249
 * modifications
250
 *
251
 * Revision 1.14  96/03/29  14:46:30  14:46:30  mjames (Mike James)
252
 * Added VHDL netlist writing to the capabilities of ACFREAD
253
 *
254
 * Revision 1.12  96/03/19  08:51:43  08:51:43  mjames (Mike James)
255
 * Corrected bug with zero length nets crashing WRITE PCB
256
 *
257
 * Revision 1.8  96/03/13  15:36:10  15:36:10  mjames (Mike James)
258
 * Altered the how_routed field to be used to indicate the routing algorithm used
259
 * to route this net.
260
 *
261
 * Revision 1.7  96/02/13  09:13:27  09:13:27  mjames (Mike James)
262
 * Updated to be version 2.0 with net joining
263
 *
264
 * Revision 1.6  96/02/09  10:50:21  10:50:21  mjames (Mike James)
265
 * Added different behaviour for 'write id' and 'write name'
266
 * 'write id' now writes all pins including unused ones
267
 * 'write name' only writes used pins in the ACF file
268
 *
269
 * Revision 1.5  96/02/08  15:28:28  15:28:28  mjames (Mike James)
270
 * First release
271
 *
272
 * Revision 1.4  96/02/07  16:01:32  16:01:32  mjames (Mike James)
273
 * Added correct RCS header
274
 *
275
 * Revision 1.3  96/02/07  15:50:42  15:50:42  mjames (Mike James)
276
 * Added RCS ident message
277
 *
278
 * Revision 1.2  96/02/07  11:04:19  11:04:19  mjames (Mike James)
279
 * Checkin before adding new command parsing to program
280
 *
281
 * Revision 1.1  96/01/10  13:13:51  13:13:51  mjames (Mike James)
282
 * Initial revision
283
 *
284
 */
285
#include "printout.h"
286
 
287
#include "cmdlog.h"
288
#include "cmdparse.h"
289
#include "database.h"
290
#include "equivalent.h"
291
#include "expression.h"
292
#include "generic.h"
293
#include "print_vhdl.h"
294
#include "print_vlog.h"
295
#include "sorting.h"
296
#include "version.h"
297
#include "vertcl_main.h"
298
 
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 $"
308
 
309
/* decoding pin direction in ACF form */
310
/* see pindir_t in database.h */
311
static char *decode_pin[] = {"NONE",
312
                             "INPUT_PIN",
313
                             "OUTPUT_PIN",
314
                             "output_pin", /* buffer is a sort of Output pin (lower case is for
315
                                              info only )*/
316
                             "BIDIR_PIN ",
317
                             "CONFIG_PIN",
318
                             "POWER_PIN"};
319
 
320
/* returns a valid pointer to a null string */
321
char *check_null_str (char *s)
322
{ /* using shortcircuit evaluation rules here */
323
        if (!s || s[0] == 0 || strcmp (s, nullstr) == 0)
324
                return (nullstr);
325
        else
326
                return (s);
327
}
328
 
329
/* ********************************************************************** */
330
 
331
/* this prints out the contents of the working database */
332
/* prints a single net as a connection */
333
/* subnets are printed as having the how_routed field of their
334
   parent, because this is the how_routed value that is indicated
335
   by the routing */
336
 
337
void list_net_nodes (FILE *f, net_t *cnet, net_t *root_net)
338
{
339
        noderef_t *bnode;
340
        node_t *cnode;
341
        int wrapc;
342
        if (!cnet)
343
                return;
344
        fprintf (
345
            f,
346
            " CONNECTION \"%s\" \"%s\" %s; -- %d nodes\n ",
347
            cnet->identifier,
348
            check_null_str (root_net->name),
349
            decode_how_routed[root_net->how_routed],
350
            cnet->nodecount);
351
        fprintf (
352
            f,
353
            "-- partition port=%d in=%d need_buff=%d\n",
354
            cnet->leaves_partition,
355
            cnet->inside_partition,
356
            cnet->needs_buff_sig);
357
        if (cnet->vhdltype)
358
        {
359
                fprintf (f, "-- vhdl '");
360
                print_range_expression (f, cnet->vhdltype->expr, NO_RECURSE);
361
                fprintf (f, "'\n");
362
        }
363
        if (cnet->type_defined)
364
                fprintf (f, "-- net type defined\n");
365
        bnode = cnet->nodes;
366
        wrapc = 0;
367
        while (bnode)
368
        {
369
                cnode = bnode->node;
370
                fprintf (f, " %s(%s)", cnode->socket->identifier, cnode->identifier);
371
                /* printout if any lines have fix_location flags set */
372
                if (cnode->fix_location)
373
                {
374
                        wrapc += 2; /* cant get as much on this line */
375
                        fprintf (f, " FIX_LOCATION");
376
                }
377
                if (cnode->fixed_pin)
378
                {
379
                        wrapc += 2; /* cant get as much on this line */
380
                        fprintf (f, " %s", decode_pin[cnode->pindir]);
381
                }
382
                if (cnode->pin_group)
383
                {
384
                        wrapc += 2; /* cant get as much on this line */
385
                        fprintf (f, " (%d)", cnode->pin_group);
386
                }
387
                fprintf (f, ";");
388
 
389
                wrapc++;
390
                if (wrapc >= 8)
391
                {
392
                        wrapc = 0;
393
                        fprintf (f, "\n ");
394
                }
395
                bnode = bnode->next;
396
        };
397
        if (wrapc)
398
                fprintf (f, "\n ");
399
        fprintf (f, "END_CONN;\n");
400
}
401
 
402
/* ********************************************************************** */
403
void list_net_structure (
404
    FILE *f, net_t *cnet, net_t *root_net, int alias_depth, int flatten_jumpers)
405
{
406
        net_t *subnet;
407
        subnet = cnet->subnets;
408
        if (cnet == root_net)
409
                fprintf (f, "--Top Level\n");
410
        if (cnet->how_joined == Jumpered && subnet)
411
        {
412
                fprintf (
413
                    f,
414
                    "-- Jumpered Connections to '%s' name '%s' found here --\n",
415
                    cnet->identifier,
416
                    cnet->name);
417
                if (flatten_jumpers == FLATTEN_JUMPERS)
418
                        list_net_nodes (f, cnet, root_net);
419
 
420
                else
421
                        while (subnet)
422
                        {
423
                                list_net_structure (
424
                                    f, subnet, root_net, 0, flatten_jumpers); /* depth = 0, not
425
                                                                                 aliased */
426
                                subnet = subnet->joined_nets;
427
                        }
428
                fprintf (f, "--\n");
429
        }
430
        else if (cnet->how_joined == Aliased && subnet)
431
        {
432
                fprintf (f, "-- Net nodes of aliased list here \n");
433
                list_net_nodes (f, cnet, root_net);
434
                fprintf (
435
                    f,
436
                    "-- %*s '%s' (name %s) created by Alias of  --\n",
437
                    alias_depth,
438
                    "",
439
                    cnet->identifier,
440
                    cnet->name);
441
                while (subnet)
442
                {
443
                        fprintf (f, "-- %*s  '%s' -- \n", alias_depth, "", subnet->identifier);
444
                        list_net_structure (
445
                            f, subnet, root_net, alias_depth + 1, flatten_jumpers);
446
                        subnet = subnet->joined_nets;
447
                }
448
                fprintf (f, "--\n");
449
        }
450
        else if (alias_depth == 0)
451
                list_net_nodes (f, cnet, root_net);
452
}
453
 
454
/* ********************************************************************** */
455
/* lists all the connections on the board */
456
void list_nets (FILE *f, net_t *cnet, int flatten_jumpers)
457
{
458
        while (cnet)
459
        {
460
                list_net_structure (f, cnet, cnet, 0, flatten_jumpers);
461
                cnet = cnet->next;
462
        }
463
}
464
 
465
/* ********************************************************************** */
466
 
467
static void list_join (FILE *f, char *typ, net_t *cnet)
468
{
469
        int wrapc = 1;
470
        /*  printf("List join %s , cnet = %p, join_parent = %p , join_parent->id =%p\n",
471
                  typ,cnet,cnet->join_parent,cnet->join_parent->identifier); */
472
        fprintf (f, " %s %s = (", typ, cnet->join_parent->identifier);
473
        while (cnet)
474
        {
475
                if (cnet->external_node)
476
                        fprintf (
477
                            f,
478
                            "%s(%s); ",
479
                            cnet->external_node->socket->identifier,
480
                            cnet->external_node->identifier);
481
                else
482
                        fprintf (f, "%s; ", cnet->identifier);
483
                wrapc++;
484
                if (wrapc == 8)
485
                {
486
                        wrapc = 0;
487
                        fprintf (f, "\n  ");
488
                }
489
                cnet = cnet->joined_nets;
490
        }
491
        fprintf (f, ");");
492
}
493
 
494
/* ********************************************************************** */
495
/* we are now one level down so it must be a join of some sort
496
   therefore join_parent is now valid */
497
static void list_subnets (FILE *f, net_t *cnet, JoinMode_t join)
498
{
499
        net_t *tnet = cnet;
500
        char *nettype;
501
        net_t *topname;
502
 
503
        while (tnet)
504
        {
505
                if (tnet->subnets)
506
                        list_subnets (f, tnet->subnets, join);
507
                tnet = tnet->joined_nets;
508
        }
509
 
510
        /* if we are interested in aliases, print these */
511
        /* Or if we are interested in joins print these */
512
 
513
        /*  printf("id %s join_parent %p howjoin %d\n",
514
              cnet->identifier,cnet->join_parent,cnet->how_joined); */
515
 
516
        if (cnet->join_parent->how_joined == join)
517
        {
518
                switch (join)
519
                {
520
                case Aliased:
521
                        nettype = "ALIAS";
522
                        break;
523
                case Jumpered:
524
                        nettype = "JUMPER";
525
                        break;
526
                default:
527
                        nettype = "??";
528
                        break;
529
                };
530
                list_join (f, nettype, cnet);
531
 
532
                topname = cnet;
533
                /* ascend jumper hierarchy to get the real name */
534
                while (topname->join_parent && ISNULLSTR (topname->name))
535
                        topname = topname->join_parent;
536
 
537
                if (join != Aliased && !ISNULLSTR (topname->name))
538
                        fprintf (f, " -- signal '%s' \n", topname->name);
539
                else
540
                        fprintf (f, "\n");
541
        };
542
}
543
/* ********************************************************************** */
544
 
545
/* 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 */
547
 
548
static void list_joined_nets (FILE *f, net_t *cnet)
549
{
550
        if (!cnet)
551
                return;
552
 
553
        while (cnet)
554
        {
555
                /* if there are any subnets here, do the recursion on them */
556
                /*    printf("cnet = %p, subnets= %p \n",cnet,cnet->subnets); */
557
                if (cnet->subnets)
558
                {
559
                        list_subnets (f, cnet->subnets, Jumpered);
560
                }
561
                if (cnet->vhdl_connect_net)
562
                {
563
                        fprintf (
564
                            f,
565
                            " VHDL_CONN %s <= %s;\n",
566
                            cnet->name,
567
                            cnet->vhdl_connect_net->name);
568
                }
569
                cnet = cnet->next;
570
        }
571
}
572
 
573
/************************************************************************/
574
 
575
static void list_routed_aliased_nets (FILE *f, net_t *cnet)
576
{
577
        if (!cnet)
578
                return;
579
 
580
        while (cnet)
581
        {
582
                net_t *unrouted = cnet->unrouted_reference;
583
                /* if there are any subnets here, do the recursion on them */
584
                /* this will find out aliases if they exist */
585
                if (unrouted && unrouted->subnets)
586
                        list_subnets (f, unrouted->subnets, Aliased);
587
                cnet = cnet->next;
588
        }
589
}
590
 
591
/************************************************************************/
592
 
593
static void list_aliased_nets (FILE *f, net_t *cnet)
594
{
595
        if (!cnet)
596
                return;
597
 
598
        while (cnet)
599
        {
600
                /* if there are any subnets here, do the recursion on them */
601
                /*    printf("cnet = %p, subnets= %p \n",cnet,cnet->subnets); */
602
                if (cnet->subnets)
603
                        list_subnets (f, cnet->subnets, Aliased);
604
 
605
                cnet = cnet->next;
606
        }
607
}
608
 
609
/************************************************************************/
610
void list_components (FILE *f)
611
{
612
        socket_t *cskt = sort_sockets (&socket_head);
613
        fprintf (f, "COMPONENTS\nBEGIN\n");
614
        while (cskt)
615
        {
616
                if (cskt->is_template)
617
                        fprintf (f, "-- %s : Socket Template\n", cskt->type);
618
                else
619
                        fprintf (
620
                            f,
621
                            "  %s : \"%s\" \"%s\" \"%s\"; -- %s\n",
622
                            cskt->identifier,
623
                            check_null_str (cskt->name),
624
                            check_null_str (cskt->type),
625
                            check_null_str (cskt->value),
626
                            cskt->is_external ? "External" : "Internal");
627
                cskt = cskt->next;
628
        };
629
        fprintf (f, "END;\n\n");
630
}
631
 
632
/***********************************************************************************/
633
/* only list device info for those sockets which have "external" flags set          */
634
/*
635
This is intended to provide Vertical write extern
636
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
638
context the contents of socket U1 will be known as device name U1.
639
 
640
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.
642
*/
643
 
644
void list_extern_sockets (FILE *f)
645
{
646
        socket_t *cskt = sort_sockets (&socket_head);
647
        char *name;
648
        fprintf (f, "COMPONENTS\nBEGIN\n");
649
        while (cskt)
650
        {
651
                if (cskt->is_external)
652
                {
653
                        /* force the device to have an identifier if it does not have one */
654
                        name = cskt->name;
655
                        if (ISNULLSTR (name))
656
                                name = cskt->identifier;
657
 
658
                        fprintf (
659
                            f,
660
                            "  %s : \"%s\" \"%s\" \"%s\";\n",
661
                            cskt->identifier,
662
                            name,
663
                            check_null_str (cskt->type),
664
                            check_null_str (cskt->value));
665
                }
666
                cskt = cskt->next;
667
        };
668
        fprintf (f, "END;\n\n");
669
}
670
 
671
/************************************************************************/
672
void list_database (FILE *f, int flatten_jumpers)
673
{
674
        list_components (f);
675
 
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
}
685
/************************************************************************/
686
void list_jumper (FILE *f)
687
{
688
        fprintf (f, "-- Jumper list here --\n");
689
        fprintf (f, "JOINED_NETS\nBEGIN\n");
690
 
691
        fprintf (f, "-- named list\n");
692
        list_joined_nets (f, named_list);
693
        fprintf (f, "-- routed list\n");
694
        list_joined_nets (f, routed_list);
695
        fprintf (f, "END;\n\n");
696
}
697
 
698
/************************************************************************/
699
void list_alias (FILE *f)
700
{
701
        fprintf (f, "-- Alias list here --\n");
702
        fprintf (f, "JOINED_NETS\nBEGIN\n");
703
        fprintf (f, "-- named list\n");
704
        list_routed_aliased_nets (f, named_list);
705
        fprintf (f, "-- routed list\n");
706
        list_routed_aliased_nets (f, routed_list);
707
        fprintf (f, "-- unrouted list\n");
708
        list_aliased_nets (f, unrouted_list);
709
        fprintf (f, "END;\n\n");
710
}
711
 
712
/************************************************************************/
713
void list_joined (FILE *f)
714
{
715
        /* and now the joined nets */
716
 
717
        fprintf (f, "JOINED_NETS\nBEGIN\n");
718
 
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
}
728
 
729
/* ********************************************************************** */
730
/* 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 */
732
/* if options & PRINT_GENERIC then print out the device's generic map here also */
733
/* 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 */
735
/* 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 */
737
/* if options & PRINT_EQUIVALENT_PINS then print the list of pin equivalents */
738
void print_device (FILE *f, socket_t *dev, int options)
739
{
740
        node_t *n;
741
        char *vhdl_bus_format;
742
 
743
        generic_info_t gen[1];
744
 
745
        /* sort all the nodes into alphabetical order */
746
        sort_nodes (dev, NO_EXTRACT_XY);
747
 
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
        }
784
        else
785
        {
786
                fprintf (f, "TEMPLATE \"%s\"\n", check_null_str (dev->type));
787
                fprintf (f, "BEGIN\n");
788
        };
789
 
790
        if (options & PRINT_GENERIC && dev->generics)
791
                list_generic_values (f, &dev->generics, 2);
792
 
793
        if (dev->is_template && dev->parent_template_ref)
794
        {
795
                fprintf (
796
                    f, "  ALIAS \"%s\"\n", check_null_str (dev->parent_template_ref->type));
797
                n = NULL; /* alias templates have no nodes of their own */
798
        }
799
        else
800
                n = dev->nodes;
801
 
802
        if (options & NO_PRINT_PINS)
803
                n = NULL;
804
 
805
        while (n)
806
        {
807
                char tmp_name[MAXIDLEN], vhdltail[MAXIDLEN], group_tail[MAXIDLEN];
808
                int iter, iter_hi, iter_low;
809
                vhdl_t *vhdl;
810
                if (n->net_assigned || (options & PRINT_ALL) || dev->is_template ||
811
                    ((options & PRINT_NET_NAMES) && n->routed_net &&
812
                     !ISNULLSTR (n->routed_net->name)))
813
                {
814
                        /* there is a possibility here of printing
815
                           out a bus as separate signals */
816
                        if (n->orig_vhdltype) /* if a pin rename has taken place, use the
817
                                                 original name !! */
818
                                vhdl = n->orig_vhdltype;
819
                        else
820
                                vhdl = n->vhdltype;
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
                        }
837
                        else
838
                        {
839
                                iter_hi = 0;
840
                                iter_low = 0;
841
                        }
842
 
843
                        for (iter = iter_low; iter <= iter_hi; iter++)
844
                        {
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",
921
                                    n->refcount,
922
                                    n->fixed_pin ? "fixed" : "",
923
                                    n->in_use ? "in use" : "unused",
924
                                    n->net_assigned ? "net assigned" : "");
925
                        };
926
                }
927
                n = n->sktnext; /* traverse to next pin on socket */
928
        };
929
 
930
        /* use routine in equivalent.c */
931
        if (options & PRINT_EQUIVALENT_PINS)
932
                list_equivalent_pins (f, dev);
933
        fprintf (f, "END;\n\n");
934
}
935
 
936
/************************************************************************/
937
/* this function prints the 'entity' of a top level of a partition as an
938
   ACFP file */
939
 
940
void print_ACF_entity (FILE *f, char *entityname)
941
{
942
        net_t *net = named_list;
943
        int pin_num = 1;
944
 
945
        fprintf (f, "CHIP %s\n", entityname);
946
 
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
}
968
/************************************************************************/
969
 
970
/* devices are always listed in acfp files with VHDL data types */
971
void list_devices (FILE *f, int listflags)
972
{
973
        socket_t *dev;
974
        dev = socket_head;
975
        while (dev)
976
        {
977
                /* only print named devices !!! */
978
                if (!ISNULLSTR (dev->name))
979
                        print_device (f, dev, listflags);
980
                dev = dev->next;
981
        };
982
}
983
 
984
/************************************************************************/
985
/* devices are always listed in acfp files with VHDL data types */
986
/* only those with their is_external flags set */
987
 
988
void list_extern_devices (FILE *f)
989
{
990
        socket_t *dev;
991
        dev = socket_head;
992
        while (dev)
993
        {
994
                /* only print external devices !!! */
995
                if (dev->is_external)
996
                        print_device (f, dev, PRINT_TYPE | PRINT_NET_NAMES);
997
                dev = dev->next;
998
        };
999
}
1000
 
1001
/************************************************************************/
1002
static int list_pin_renames (net_t *list, FILE *f, int any_renames_seen)
1003
{
1004
        noderef_t *nodes, *ref;
1005
 
1006
        if (!list)
1007
                return any_renames_seen;
1008
        while (list)
1009
        {
1010
                nodes = list->nodes;
1011
 
1012
                while (nodes)
1013
                {
1014
                        ref = nodes->base_noderef;
1015
                        if (ref->orig_name)
1016
                        {
1017
                                if (!any_renames_seen)
1018
                                { /* overall, start the list if there is a rename */
1019
                                        fprintf (f, "RENAME_PINS\n BEGIN\n");
1020
                                        any_renames_seen = 1;
1021
                                }
1022
                                if (ref->orig_vhdltype)
1023
                                {
1024
                                        fprintf (f, "  %s", list->identifier);
1025
                                        decode_vhdl_bus (f, ref->vhdltype, 0);
1026
                                        fprintf (f, " = ( ");
1027
                                }
1028
                                else
1029
                                        fprintf (f, "  %s = ( ", list->identifier);
1030
                                fprintf (
1031
                                    f,
1032
                                    "%s.%s;);\n",
1033
                                    ref->node->socket->identifier,
1034
                                    ref->orig_name);
1035
                        }
1036
                        nodes = nodes->next;
1037
                }
1038
                list = list->next;
1039
        }
1040
        return (any_renames_seen);
1041
}
1042
 
1043
/************************************************************************/
1044
 
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
 
1058
/************************************************************************/
1059
 
1060
/************************************************************************/
1061
/* and now for the FRB formatted stuff                                  */
1062
/* prints a frb formatted net   */
1063
void frb_list_net (FILE *f, net_t *cnet)
1064
{
1065
        noderef_t *bnode;
1066
        node_t *cnode;
1067
        bnode = cnet->nodes;
1068
        if (bnode)
1069
        { /* only print out a net that has at leat one node on it */
1070
                cnode = bnode->node;
1071
                fprintf (
1072
                    f,
1073
                    ".ADD_TER %s %s %s\n",
1074
                    cnode->socket->identifier,
1075
                    cnode->identifier,
1076
                    cnet->identifier);
1077
                bnode = bnode->next;
1078
 
1079
                if (bnode)
1080
                        fprintf (f, ".TER\n");
1081
                while (bnode)
1082
                {
1083
                        cnode = bnode->node;
1084
                        fprintf (f, "%s %s\n", cnode->socket->identifier, cnode->identifier);
1085
                        bnode = bnode->next;
1086
                };
1087
                fprintf (f, "\n");
1088
        };
1089
}
1090
 
1091
/* ********************************************************************** */
1092
 
1093
/* only jumpered nets are permitted to be listed as separate physical nets*/
1094
/* aliased nets cannot, as they are asingle physical net */
1095
void frb_list_net_connections (FILE *f, net_t *cnet)
1096
{
1097
        while (cnet)
1098
        {
1099
                net_t *subnet = cnet->subnets;
1100
                if (subnet && cnet->how_joined == Jumpered)
1101
                {
1102
                        while (subnet)
1103
                        {
1104
                                frb_list_net (f, subnet);
1105
                                subnet = subnet->subnets;
1106
                        }
1107
                }
1108
                else
1109
                        frb_list_net (f, cnet);
1110
 
1111
                cnet = cnet->next;
1112
        };
1113
}
1114
 
1115
/* ********************************************************************** */
1116
 
1117
void produce_frb (FILE *f)
1118
 
1119
{
1120
        time_t now;
1121
        struct tm *tim;
1122
 
1123
        socket_t *dev;
1124
 
1125
        time (&now);
1126
        tim = localtime (&now);
1127
 
1128
        fprintf (
1129
            f,
1130
            ".HEA\n.TIM         %4d %02d %02d %02d %02d %02d\n",
1131
            tim->tm_year + 1900,
1132
            tim->tm_mon + 1, /* tm_mon has range 0..11 (jan=0) */
1133
            tim->tm_mday,    /* but tm_mday has range 1..31 !! */
1134
            tim->tm_hour,
1135
            tim->tm_min,
1136
            tim->tm_sec);
1137
 
1138
        fprintf (f, ".JOB               J_%d\n", (int) now);
1139
 
1140
        fprintf (f, ".TYP               FULL\n");
1141
        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
 
1152
        frb_list_net_connections (f, named_list);
1153
        frb_list_net_connections (f, routed_list);
1154
 
1155
        fprintf (f, ".END\n");
1156
}
1157
 
1158
/* ********************************************************************** */
1159
#if defined PC
1160
#define FMT1STR " Produced by %s (PC-CygWin)\n"
1161
#define FMT2STR " at %02d:%02d:%02d     on %02d/%02d/%4d \n\n"
1162
#else
1163
#define FMT1STR " Produced by %s (HPUX)\n"
1164
#define FMT2STR " at %02d:%02d:%02d     on %02d/%02d/%4d \n\n"
1165
#endif
1166
 
1167
#define VHDL_FMTSTR "--" FMT1STR "--" FMT2STR
1168
#define VLOG_FMTSTR "/*" FMT1STR " *" FMT2STR "*/"
1169
 
1170
/* puts a comment on the head of the file */
1171
void print_header (FILE *f, char *tool)
1172
 
1173
{
1174
        time_t now;
1175
        struct tm *tim;
1176
 
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
}
1195
 
1196
/* puts a comment on the head of the file */
1197
void print_VLOG_header (FILE *f, char *tool)
1198
 
1199
{
1200
        time_t now;
1201
        struct tm *tim;
1202
 
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
}