Subversion Repositories Vertical

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /* $Id: cmdexec1.c,v 1.1.1.1 2003/11/04 23:34:56 mjames Exp $
  2.  *
  3.  * $Log: cmdexec1.c,v $
  4.  * Revision 1.1.1.1  2003/11/04 23:34:56  mjames
  5.  * Imported into local repositrory
  6.  *
  7.  * Revision 1.31  2002/09/09 10:17:41  mjames
  8.  * Altered search path description for HPUX
  9.  *
  10.  * Revision 1.30  2002/08/23 14:20:44  mjames
  11.  * Updated comments on regular expressions.
  12.  *
  13.  * Revision 1.29  2002/08/19 14:30:04  mjames
  14.  * Added the 'write UCF' command for
  15.  * listing pin assignments in Xilinx UCF file format
  16.  *
  17.  * Revision 1.28  2002/08/06 12:52:07  mjames
  18.  * Merge in from latest version
  19.  *
  20.  * Revision 1.31  2002/04/04 14:53:05  mjames
  21.  * Added mentor board station reader to the portfolio
  22.  *
  23.  * Revision 1.30  2002/03/21 17:14:22  mjames
  24.  * Added search path to vertical file opening for read
  25.  *
  26.  * Revision 1.29  2002/03/08 14:56:14  mjames
  27.  * Edited all of the commands in the cmdexec1.c and cmdexec2.c files
  28.  * so that they can be read by doc2.pl
  29.  *
  30.  * Revision 1.28  2002/03/08 11:54:38  mjames
  31.  * Tagging for perl script to list commands out
  32.  *
  33.  * Revision 1.27  2002/01/15 12:37:47  mjames
  34.  * now uses a function to set the debug level rather than global variable
  35.  *
  36.  * Revision 1.26  2001/12/24 21:14:00  mjames
  37.  * Added header includes to get correct declarations for all functions
  38.  * called from command handlers
  39.  *
  40.  * Revision 1.25  2001/12/24 20:08:38  mjames
  41.  * Added more information about ensure template command to help message
  42.  *
  43.  * Revision 1.24  2001/12/20 13:54:19  mjames
  44.  * Update version number to 15.1
  45.  *
  46.  * Revision 1.23  2001/12/13 22:13:22  mjames
  47.  * Vertical now supports nested include database files
  48.  * This allows wrappers around 'pure' VHDL or Verilog files
  49.  *
  50.  * Read command now initialises include stack correctly
  51.  *
  52.  * Revision 1.22  2001/11/19 10:41:05  mjames
  53.  * Merge conflict resolution
  54.  *
  55.  * Revision 1.21  2001/11/09 22:14:45  mjames
  56.  * Added in delete chip node connection command
  57.  * In order to remove small number of chip pins in a large board
  58.  * which have been damaged.
  59.  *
  60.  * Revision 1.20.2.1  2001/11/16 15:13:23  mjames
  61.  * Included some more needed header files
  62.  * Added extra documentation in auto generate -> HTML
  63.  *
  64.  * Revision 1.20  2001/10/31 22:20:00  mjames
  65.  * Tidying up problematical comments caused by CVS
  66.  * 'intelligent' comment guessing
  67.  *
  68.  * Revision 1.19  2001/10/23 21:28:51  mjames
  69.  * Produce a list of diagnostic printouts enabled via the debug <n> command
  70.  *
  71.  * Revision 1.18  2001/10/11 16:10:18  mjames
  72.  * Corrections to the SWAP command, and printout so that
  73.  * WRITE net now outputs all chips in the design so that their generics
  74.  * can be passed forward to the next phase.
  75.  *
  76.  * Revision 1.17  2001/10/02 20:55:18  mjames
  77.  * Edited help files to try and get them more up to date.
  78.  *
  79.  * Revision 1.16  2001/09/21 14:13:52  mjames
  80.  * Implemented Write Pin command
  81.  *
  82.  * Revision 1.15  2001/08/23 20:44:14  mjames
  83.  * Corrected mistake in file name on write fit command.
  84.  *
  85.  * Revision 1.14  2001/07/09 15:09:36  mjames
  86.  * Lists external sockets as components before using them
  87.  *
  88.  * Revision 1.13  2001/06/20 13:09:45  mjames
  89.  * Took out 'from from' message.
  90.  *
  91.  * Revision 1.12  2001/06/19 05:24:34  mjames
  92.  * Created a trap_fopen to overcome trying to write to read only files.
  93.  * If this attempted in NT the file can be opened but not written to.
  94.  *
  95.  * Revision 1.11  2001/06/06 12:10:25  mjames
  96.  * Move from HPUX
  97.  *
  98.  * Revision 1.10  2001/04/09 14:58:28  mjames
  99.  * Added capability to delete generics from specific sockets.
  100.  *
  101.  * Revision 1.9  2001/04/04 22:12:31  mjames
  102.  * Added some online documentation to the C program command handler
  103.  * THis is scanned by a utility called 'doc' that currently creates
  104.  * simple HTML from part formatted C comments
  105.  *
  106.  * Also working well on printing VERILOG
  107.  *
  108.  * still have problems with C comments and VERTICAL pragmas.
  109.  *
  110.  * Revision 1.8  2001/03/19 19:13:21  mjames
  111.  * Tidied up a few commands
  112.  *
  113.  * Revision 1.7  2001/02/06 22:41:14  mjames
  114.  * Added correct argument passing for 'read file comp_suffix arg0 arg1 arg2 ...
  115.  *
  116.  * Revision 1.6  2001/02/01 21:41:43  mjames
  117.  * Made the code begin to compile without TCL/TK
  118.  *
  119.  * Revision 1.5  2001/01/26 21:50:09  mjames
  120.  * Managed to get vertical non TCL to compile again
  121.  *
  122.  * Conversion to argv, argc[] mode of operation continues
  123.  *
  124.  * Revision 1.4  2001/01/04 21:26:54  mjames
  125.  * Modifications to add in the TCL style
  126.  * argument list to all of the functions
  127.  * .
  128.  *
  129.  * Revision 1.3  2001/01/02 07:53:51  mjames
  130.  * Made changes to allow for interface with TCL/Tk
  131.  *
  132.  * Revision 1.2  2000/10/21 20:41:29  mjames
  133.  * Added the 'write flatten' command that only lists the wires
  134.  * created by making jumpered connections rather than listing
  135.  * the jumpers themselves
  136.  *
  137.  * Revision 1.1.1.1  2000/10/19 21:58:35  mjames
  138.  * Mike put it here
  139.  *
  140.  *
  141.  Removed RCS log information to reduce clutter
  142. *****************************************************************************/
  143.  
  144. #include <stdio.h>
  145. #include <stdlib.h>
  146. #include <string.h>
  147.  
  148. #include "vertcl_main.h"
  149. #include "expression.h"
  150. #include "generic.h"
  151. #include "database.h"
  152. #include "printout.h"
  153. #include "routing.h"
  154. #include "jumpering.h"
  155. #include "ext_nets.h"
  156. #include "statistics.h"
  157. #include "partition.h"
  158. #include "cmdparse.h"
  159. #include "cmdexec.h"
  160. #include "cmdutil.h"
  161. #include "cmdlog.h"
  162. #include "rename.h"
  163. #include "template.h"
  164. #include "chck_names.h"
  165. #include "unrouted.h"
  166. #include "bundle.h"
  167. #include "print_vlog.h"
  168. #include "print_vhdl.h"
  169. #include "print_quartus.h"
  170. #include "print_ucf.h"
  171. #include "print_ports.h"
  172. tcl_mode_t  Tcl_Mode;
  173.  
  174. /* make this a global */  
  175. Tcl_Interp * Tcl_interp;
  176.  
  177.  
  178.  
  179.  
  180. #ident "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/cmdexec1.c,v 1.1.1.1 2003/11/04 23:34:56 mjames Exp $"
  181. /* Additional information for the user is provided in this section for inclusion in the
  182.    HTML file
  183.  
  184.  
  185.  
  186. @title
  187. Vertical application areas
  188. @text
  189. The following indices represent the commands that are likely to be useful for each
  190. of the 'modes' of Vertical and its PCB translator family
  191. @list_index
  192. @end
  193. */
  194.  
  195. /*
  196. @title
  197. Vertical External PCB netlist translators
  198. @index external
  199. @end
  200. */
  201.  
  202.  
  203. /*
  204. @title
  205. Vertical Pin assignment mode commands
  206. @index vertical_pin
  207. @end
  208. */
  209.  
  210. /*
  211. @title
  212. Vertical PCB merging commands
  213. @index vertical_pcb
  214. @end
  215. */
  216.  
  217. /*
  218. @title
  219. Vertical HDL handling commands
  220. @index vertical_hdl
  221. @end
  222. */
  223.  
  224. /*
  225. @title
  226. Vertical Regular expressions and commands that use them
  227. @index regular_exp
  228. @end
  229. */
  230.  
  231.  
  232.  
  233. /*
  234. @title
  235. Vertical search paths
  236. @application vertical_pin
  237. @application vertical_pcb
  238. @application vertical_hdl
  239. @text
  240. As of version 15.5a, Vertical can now use search paths when opening scripts or database
  241. files for reading. All file writes are in the current directory.
  242. @break
  243. For the PC the search path is :
  244. @listing
  245. .;c:/cygwin/usr/local/vert_files
  246. @text
  247. Or in english : look in the current directory '.' and then look in 'c:/cygwin/usr/local/vert_files'.
  248. @break
  249. For PC; filenames containing ':' or starting with either '/' or '.' are not searched down the path,
  250.  
  251. @break
  252.  
  253. The path is in the environment variable called 'VERTICAL_PATH', which can either be
  254. set in the shell (MSDOS or cygwin) which invokes vertical, or as a command from within
  255. a Vertical script. e.g.
  256. @listing
  257. setenv VERTICAL_PATH "$(VERTICAL_PATH);/home/project/reference_data"
  258. @text
  259. This will make Vertical search in the usual places and then in the additional directory.
  260. @break
  261. For the HPUX port of Vertical the search path is
  262. .;.caddata/vert_files
  263. @text
  264. For HPUX; filenames starting in '/' and '.' are not searched for down the path. These two characters are normally used to
  265. specify a definite path, either relative to the current working directory or absolute relative to the file system root.
  266. @end
  267.  
  268.  
  269.  
  270. =======
  271.    HTML file
  272. @title
  273. Vertical application areas
  274. @text
  275. The following indices represent the commands that are likely to be useful for each
  276. of the 'modes' of Vertical and its PCB translator family
  277. @listing
  278. vertical_pin
  279. vertical_pcb
  280. vertical_hdl
  281. @end
  282. */
  283.  
  284. /*
  285. @title
  286. Vertical Pin assignment mode commands
  287. @index vertical_pin
  288. @end
  289. */
  290.  
  291. /*
  292. @title
  293. Vertical PCB merging commands
  294. @index vertical_pcb
  295. @end
  296. */
  297.  
  298. /*
  299. @title
  300. Vertical HDL partitioning commands
  301. @index vertical_hdl
  302. @end
  303. */
  304.  
  305. /*
  306. @title
  307. Vertical script command notation: Command line and script files
  308. @application vertical_pin
  309. @application vertical_pcb
  310. @application vertical_hdl
  311. @text
  312. Vertical uses its own 'shell' like command language. In this language, quoting a string
  313. simply means that spaces appearing inside strings can be passed into Vertical as a single argument.
  314. Normally spaces are used to delimit parameters in a command.
  315. @break
  316. When the command is listed out the following notation is used.
  317. @text
  318. If an item is given without angle ( '<' '>' ) brackets then the word is typed as is. e.g.
  319. @listing
  320. command
  321. @break
  322. If '<' '>' angle brackets are given then this an item such as a filename which is user defined. e.g. Command followed
  323. @listing
  324. command <filename>
  325. @break
  326. If followed by an asterisk '*' it means in this context that more than one of these items
  327. may be entered. It is not the same as a regular expression used within one of these items. e.g. command followed by several items
  328. @listing
  329. command <item> *
  330. @break
  331. If '[' ']' square brackets are given then the item is optional. e.g. command with an optional parameter
  332. @listing
  333. command [ <optional> ]
  334. @text
  335. More than one of these may appear at a time on the same item. e.g. Optional list of letters.
  336. @end
  337.  
  338. @title
  339. Vertical database file notation: Database files
  340. @application vertical_pin
  341. @application vertical_hdl
  342. @application vertical_pcb
  343. @text
  344. Vertical handles several different database file formats. These are :
  345. @listing
  346. Altera .acf      : tagged as AHDL
  347. Verilog          : tagged as VERILOG
  348. VHDL             : tagged as VHDL
  349. Vertical Native  : initial state and outside other tagged blocks
  350. @text
  351. They are all read in by a single database handler which can switch between different
  352. languages on the fly.
  353. @break
  354. In all cases the Vertical parser begins expecting Vertical Native file format, and then
  355. it is switched into other modes by the presence of tag  keywords
  356. @break
  357. These bracket the code. e.g.
  358. @listing
  359. VHDL -- this indicates following syntax.
  360.   entity nine is
  361.     (
  362.     );
  363.   end entity nine;
  364.  
  365.   architecture seven of nine is
  366. -- vertical read_off
  367.  this code will not be seen by vertical, as it has
  368.  tags in the comments.
  369.  
  370.  DONT start comments with the word 'VERTICAL' as it is seen an
  371.  an escape into vertical database language.
  372. -- vertical read_on
  373.  
  374.   begin
  375.  
  376.   end;
  377. END; -- this belongs to Vertical
  378. @text
  379. Because Vertical recognises the comments that are found in
  380. all of the HDL's that it understands, it is possible to feed
  381. a native HDL file in with Vertical tags in comments.
  382. e.g.
  383.  
  384.  
  385.  
  386.  
  387. @end
  388.  
  389.  
  390.  
  391.  
  392.  
  393. @title
  394. regular expression: Information on wildcards in Vertical
  395. @application vertical_pin
  396. @application vertical_hdl
  397. @application vertical_pcb
  398. @text
  399. The wildcards now used in several commands conform to standard regular expressions.
  400. If no 'special' characters are given then patterns must match exactly, except that
  401. the case of alphabetic characters is ignored.
  402. @break
  403. For instance: to select :
  404. @listing
  405. pattern   meaning
  406. -------   -------
  407. X2[1-7]   'X' or 'x', '2' and then digit '1' to '7'      
  408. .*        any char zero or more times (anything)
  409. X[0-9]+   'X' or 'x', followed by one or more digits
  410.  
  411. (expr)    A pattern to be matched that can be used in a string replace.
  412.           Each bracketed expression can be used in a replacement string
  413.           &1 is the first pattern. &0 is the whole of the matched string.
  414.  
  415. @text
  416. On cygwin and Unix 'man regex' will work to tell you more.
  417. @break
  418. The edit_pin ident command and edit_pin type
  419. command documentation has more on regular expressions.
  420.  
  421. @break
  422. Use '\' characters to escape special characters.
  423. @end
  424.  
  425.  
  426.  
  427. */
  428.  
  429. /************************************************************************/
  430. /* Command handling code                                                */
  431. /************************************************************************/
  432.  
  433.  
  434. /*********************** Simple command calls ***************************/
  435. /* BYE : Exit program
  436. @title
  437. bye, quit, exit
  438. @application vertical_pcb
  439. @application vertical_pin
  440. @application vertical_hdl
  441. @text
  442. Leave program, closing files tidily.
  443. @end
  444. */
  445. int BYEHandler (ET_TCLARGS)
  446.    {
  447.    CloseLog();                     /* append summary and close the log file */
  448.    Log (LOG_GENERAL, "#Goodbye for now\n");
  449.    return (QUITCMD);   /* try to leave cleanly */
  450.    }
  451.  
  452.  
  453. /****************************************************************************/
  454. /* external parser variables                                                */
  455. extern int yydebug;
  456. extern FILE * yyin;
  457. extern int lineno;
  458. extern int yy_nArgs;
  459. extern char ** yy_Args;
  460.  
  461. extern int inside_block;
  462.  
  463. /* debug level */
  464. long level;
  465.  
  466. /******************** Setup YYDEBUG flag ***********************/
  467. /*
  468. @title
  469. debug <debug_flags>
  470. @application vertical_pcb
  471. @application vertical_pin
  472. @application vertical_hdl
  473. @text
  474. Internal debugging flags. Bit fields can be combined. In general issue debug
  475. flag setting commands before issuing commands:
  476. @break
  477. Followed by the 'read' command:
  478. @listing
  479. For read command:
  480.        
  481. Bit 0    : The yydebug flag (see man yacc/lex for more info)
  482.  
  483. For template command
  484. Bit 0    : Prints basic actions
  485. Bit 1    : More detailed info
  486. Bit 2    : Extremely detailed info.
  487.  
  488. For partition command
  489. Bit 0    : Prints basic actions.
  490.  
  491. For route command
  492. Bit 2    : Prints basic actions
  493. Bit 3    : More detailed info
  494.  
  495. For jumper command
  496. Bit 0    : Basic information
  497.  
  498. For set/del ext and set/del fpga commands
  499. Bit 2    : Trace operations in detail
  500.  
  501. For equivalent pin operations (normally via netlist)
  502. Bit 0    : Trace operations
  503.  
  504. For print vlog
  505. Bit 0    : In Verilog file : indicate status for wires, list unused sigs as comments
  506.  
  507. For all file opening
  508. Bit 4    : List files that Vertical attempts to open using its search path.
  509.  
  510. @end
  511. */
  512.  
  513. int DEBUGHandler(ET_TCLARGS) {
  514.  
  515.    if (argc == 1) {
  516.      level = atoi(argv[0]);
  517.      set_debug_level(level); /* send info into DLL */
  518.      yydebug = level&1 ;
  519.      Log (LOG_GENERAL, "# setting debug level to %d\n",level);
  520.      return (TCL_OK);
  521.      }
  522.    else
  523.      return (TCL_ERROR);
  524.  
  525.    }
  526.  
  527. /******************** Read a data file ***********************/
  528. /*
  529. @title
  530. read <filename> [<identifier_suffix> | "" ] [ <arg>* ]
  531. @application vertical_pcb
  532. @application vertical_pin
  533. @application vertical_hdl
  534. @text
  535. Read a data file in to the internal database. If <suffix> is
  536. given, the newly read socket and net identifiers are suffixed
  537. with the suffix given. This is the means by which a single PCB
  538. netlist file is given a unique identity. In this way the same
  539. netlist may be repeated many times, but every object is given
  540. an unique identifier.
  541. In other words if the netlist is read in twice, once with the
  542. suffix 'a' and once with the suffix 'b' then a socket 'U1' in
  543. the netlist will become two sockets : 'U1a' and U1b' in the
  544. combined netlist.
  545. @break
  546. String concatenation WARNING:
  547. @break
  548. If you have a set of sockets in the PCB netlist file  with
  549. identifiers U1 to U 20 and you decide to suffix a new ACF file
  550. being read with "0" then U1 in the new file will match U10 in
  551. the old file and will 'vanish' or be confused with U10 in the
  552. old file. The best way to avoid this problem is to
  553. It is normal to use an underscore character as in "_" to
  554. prefix the suffix to avoid this.
  555. @break
  556. In addition any arguments after the suffix field (which can be omitted if a "" null string is
  557. given) can be used as macro variables $0, $1 and so on inside the database file.
  558. e.g.
  559. @listing
  560. read conn.txt ""  x1_a x1_b
  561. @text
  562. Will, if the file conn.txt contains the following
  563. @listing
  564. JOINED_NETS
  565. BEGIN
  566.  
  567.  
  568.  JUMPER J_$0$1_3A  = ($0(3A );$1(16A); );
  569.  JUMPER J_$0$1_4A  = ($0(4A );$1(15A); );
  570.  JUMPER J_$0$1_5A  = ($0(5A );$1(14A); );
  571.  JUMPER J_$0$1_6A  = ($0(6A );$1(13A); );
  572.  
  573. END;
  574. @text
  575. Be translated into
  576. @listing
  577. JOINED_NETS
  578. BEGIN
  579.  
  580.  
  581.  JUMPER J_x1_ax1_b_3A  = (x1_a(3A );x2_a(16A); );
  582.  JUMPER J_x1_ax1_b_4A  = (x1_a(4A );x2_a(15A); );
  583.  JUMPER J_x1_ax1_b_5A  = (x1_a(5A );x2_a(14A); );
  584.  JUMPER J_x1_ax1_b_6A  = (x1_a(6A );x2_a(13A); );
  585.  
  586. END;
  587. @text
  588. If no arguments are given, then the argument list of the currently
  589. executing script are used as $0, $1 and so on.
  590.  
  591. @end
  592. */
  593. extern void tidy_lex(void);
  594.  
  595. extern int yyparse(void);
  596.  
  597. int READHandler (ET_TCLARGS)
  598.    {
  599.    int rc =0;
  600.    int     old_yy_nArgs;
  601.    char ** old_yy_Args;
  602.  
  603. #if defined DIAGNOSE
  604.    {
  605.    int i;
  606.    printf("local args\n");
  607.  
  608.    for(i=0;i<argc;i++)
  609.      printf("[%d]=%s\n",i,argv[i]?(argv[i][0]?argv[i]:"\"\""):"<null>");
  610.    printf("global args\n");
  611.  
  612.    for(i=0;i<yy_nArgs;i++)
  613.      printf("[%d]=%s\n",i,yy_Args[i]?(yy_Args[i][0]?yy_Args[i]:"\"\""):"<null>");
  614.  
  615.    }
  616. #endif
  617.    if (argc < 1)
  618.      return(TCL_ERROR);
  619.  
  620.    Log(LOG_GENERAL, "# reading information from <%s>\n", argv[0]);
  621.    mark_board_objects(); /* record some pointers - last object before rename */
  622.    inside_block  = 0;
  623.  
  624.    tidy_lex();
  625.  
  626.    yyin = trap_fopen(argv[0], "r");             /* open text file for reading */
  627.    if (!yyin)
  628.       {
  629.       Log(LOG_ERROR, "# Error opening file: <%s>\n", argv[0]);
  630.       return(TCL_ERROR);
  631.       }
  632.    else
  633.       {
  634.       /* setup the argument lists for expansion :
  635.          either inherit from calling script (no args) or
  636.          copy from rest of command line. No need to make duplicates of
  637.          values as they cannot be changed within a 'read' operation
  638.          unlike 'do' which may call other command files with different arg.
  639.          lists.
  640.        */
  641.       old_yy_nArgs = yy_nArgs;
  642.       old_yy_Args  = yy_Args;
  643.       if(argc>=3) {
  644.         yy_Args = argv+2;
  645.         yy_nArgs= argc-2;
  646.         }
  647.  
  648. #if defined DIAGNOSE
  649.  
  650.    {
  651.    int i;
  652.    printf("new global args\n");
  653.  
  654.    for(i=0;i<yy_nArgs;i++)
  655.      printf("[%d]=%s\n",i,yy_Args[i]?(yy_Args[i][0]?yy_Args[i]:"\"\""):"<null>");
  656.  
  657.    }
  658. #endif
  659.  
  660.       lineno = 1;
  661.       while(!feof(yyin) && !rc) {
  662.         if(yydebug)
  663.           Log(LOG_GENERAL,"Processing line %d\n",lineno);
  664.         rc = yyparse();
  665.  
  666.         }
  667. #if defined DIAGNOSE
  668.    {
  669.    int i;
  670.    printf("new2 global args\n");
  671.  
  672.    for(i=0;i<yy_nArgs;i++)
  673.      printf("[%d]=%s\n",i,yy_Args[i]?(yy_Args[i][0]?yy_Args[i]:"\"\""):"<null>");
  674.  
  675.    }
  676. #endif
  677.       fclose (yyin);
  678.       yy_nArgs = old_yy_nArgs;
  679.       yy_Args  = old_yy_Args;
  680.  
  681.  
  682.  
  683. /* added the concatenation of suffixes
  684.  * to the Names and Identifiers of objects *
  685.  * if there was a suffix and it is not null apply it */
  686.       if (argc>=2 && !ISNULLSTR(argv[1])) {
  687.         set_board_suffix(argv[1]);
  688.         Log(LOG_GENERAL, "# Object name/identifier suffix = '%s'\n", argv[1]);
  689.         }      
  690.       need_validate_names=1;/* tell validate_names there is some work to do */
  691.  
  692.       if(rc == 0)
  693.         return (TCL_OK);
  694.       else
  695.         return(TCL_ERROR);
  696.       }
  697.    }
  698.  
  699. /******************** Output an ACF file all pins connected to nets  ***********************/
  700. /*
  701. @title
  702. write connected <filename>
  703. @application vertical_pcb
  704. @application vertical_pin
  705. @text
  706. Write out an 'Extended ACF' file for the entire netlist and
  707. device and net assignments. If there are any sockets with
  708. names assigned to the socket identifier (implying the socket
  709. contains something important) then their entire pinout (without pin reservations) will be
  710. written as part of the netlist. All connections made to external sockets will be listed.
  711. @end
  712. */
  713. int WriteConnectedHandler (ET_TCLARGS)
  714.    {
  715.    FILE * ACFfile;
  716.  
  717.    if (argc < 1)
  718.      return(TCL_ERROR);  
  719.    Log(LOG_GENERAL, "# producing an ACF file <%s>\n", argv[0]);
  720.    ACFfile = trap_fopen(argv[0], "w");             /* open text file for reading */
  721.    if (!ACFfile) {
  722.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[0]);
  723.      return(TCL_ERROR);
  724.      }
  725.    else {
  726.      create_unrouted_list();
  727.      print_header(ACFfile,TOOL_NAME": WRITE CONNECTED");
  728.      list_database(ACFfile,PRESERVE_JUMPERS);
  729.      list_jumper(ACFfile);
  730.      list_generic_values(ACFfile,&global_generics,0);
  731.  
  732.      list_devices(ACFfile,
  733.          PRINT_TYPE|PRINT_EXPAND_BUS| PRINT_NET_NAMES|
  734.          PRINT_GENERIC|PRINT_GROUP|
  735.          PRINT_ROUTE_FLAGS | PRINT_EQUIVALENT_PINS);
  736.      list_alias(ACFfile);
  737.      print_pin_renames(ACFfile);
  738.      fclose(ACFfile);
  739.      return (TCL_OK);
  740.      }
  741.    }
  742.  
  743. /******************** Output an ACF file ***********************/
  744. /*
  745. @title
  746. write acf <filename>
  747. @application vertical_pcb
  748. @application vertical_pin
  749. @text
  750. Write out an 'Extended ACF' file for the entire netlist and
  751. device and net assignments. If there are any sockets with
  752. names assigned to the socket identifier (implying the socket
  753. contains something important) then their pinout will be
  754. written as part of the netlist. Connections to sockets without
  755. names assigned are still written out.
  756. @end
  757. */
  758. int WriteAcfHandler (ET_TCLARGS)
  759.    {
  760.    FILE * ACFfile;
  761.  
  762.    if (argc < 1)
  763.      return(TCL_ERROR);  
  764.    Log(LOG_GENERAL, "# producing an ACF file <%s>\n", argv[0]);
  765.    ACFfile = trap_fopen(argv[0], "w");             /* open text file for reading */
  766.    if (!ACFfile) {
  767.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[0]);
  768.      return(TCL_ERROR);
  769.      }
  770.    else {
  771.      create_unrouted_list();
  772.      print_header(ACFfile,TOOL_NAME": WRITE ACF");
  773.      list_database(ACFfile,PRESERVE_JUMPERS);
  774.      list_jumper(ACFfile);
  775.      list_generic_values(ACFfile,&global_generics,0);
  776.  
  777.      list_devices(ACFfile,
  778.          PRINT_TYPE|PRINT_EXPAND_BUS|
  779.          PRINT_GENERIC|PRINT_GROUP|
  780.          PRINT_ROUTE_FLAGS | PRINT_EQUIVALENT_PINS);
  781.      list_alias(ACFfile);
  782.      print_pin_renames(ACFfile);
  783.      fclose(ACFfile);
  784.      return (TCL_OK);
  785.      }
  786.    }
  787. /******************** Output an ACF, just net part file ***********************/
  788. /*
  789. @title
  790. write net <filename>
  791. @application vertical_pcb
  792. @application vertical_pin
  793. @text
  794. Write out an 'Extended ACF' file for the entire netlist. In this case no socket
  795. information is printed.
  796. @end
  797. */
  798.  
  799. int WriteNetHandler (ET_TCLARGS)
  800.    {
  801.    FILE * ACFfile;
  802.  
  803.    if (argc < 1)
  804.      return(TCL_ERROR);
  805.  
  806.    Log(LOG_GENERAL, "# producing an ACF (net only) file <%s>\n", argv[0]);
  807.    ACFfile = trap_fopen(argv[0], "w");             /* open text file for reading */
  808.    if (!ACFfile) {
  809.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[0]);
  810.      return(TCL_ERROR);
  811.      }
  812.    else {
  813.      create_unrouted_list();
  814.      print_header(ACFfile,TOOL_NAME": WRITE NET");
  815.      list_database(ACFfile,PRESERVE_JUMPERS);
  816.      list_jumper(ACFfile);
  817.      list_devices(ACFfile,
  818.          PRINT_TYPE |
  819.          PRINT_GENERIC|PRINT_GROUP|
  820.          PRINT_ROUTE_FLAGS | PRINT_EQUIVALENT_PINS|
  821.          NO_PRINT_PINS);
  822.      fclose(ACFfile);
  823.      return (TCL_OK);
  824.      }
  825.    }
  826. /******************** Write Flatten command ***********************/
  827. /*
  828. @title
  829. write flatten <filename>
  830. @application vertical_pcb
  831. @application vertical_hdl
  832. @text
  833. Write out an 'Extended ACF' file for the entire netlist and
  834. device and net assignments. If there are any sockets with
  835. names assigned to the socket identifier (implying the socket
  836. contains something important) then their pinout will be
  837. written as part of the netlist. Connections to sockets without
  838. names assigned are still written out.
  839. @break
  840. In addition, all jumpers are flattened, and the joined together
  841. nets created by jumpers are written out as a single wire. This is used with the
  842. equivalent pin connections on socket templates.
  843. @end
  844. */
  845. int WriteFlattenHandler (ET_TCLARGS)
  846.    {
  847.    FILE * ACFfile;
  848.  
  849.    if (argc < 1)
  850.      return(TCL_ERROR);
  851.  
  852.    Log(LOG_GENERAL, "# producing a flattened ACF file <%s>\n", argv[0]);
  853.    ACFfile = trap_fopen(argv[0], "w");             /* open text file for reading */
  854.    if (!ACFfile) {
  855.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[0]);
  856.      return(TCL_ERROR);
  857.      }
  858.    else {
  859.      create_unrouted_list();
  860.      print_header(ACFfile,TOOL_NAME": WRITE FLATTEN");
  861.      list_database(ACFfile,FLATTEN_JUMPERS);
  862.      fclose(ACFfile);
  863.      return (TCL_OK);
  864.      }
  865.    }
  866. /******************** Output an FRB file ***********************/
  867. /*
  868. @title
  869. write pcb <filename>
  870. @application vertical_pcb
  871. @text
  872. Write out a "neutral architecture file" PCB netlist file for
  873. CadStar. This is hard to use properly, as Southampton Cadstar
  874. users always seem to be coming up with different netlist
  875. formats, and there are problems with library portability and
  876. the unique and 'useful' way this has been setup at
  877. Southampton.
  878. @end
  879. */
  880. int WriteFrbHandler (ET_TCLARGS)
  881.    {
  882.    FILE * FRBfile;
  883.    if (argc < 1)
  884.      return(TCL_ERROR);
  885.  
  886.    Log(LOG_GENERAL, "# producing an FRB file <%s>\n", argv[0]);
  887.    FRBfile = trap_fopen(argv[0], "w");             /* open text file for reading */
  888.    if (!FRBfile) {
  889.      Log(LOG_ERROR, "# Error opening FRB output file: <%s>\n",argv[0]);
  890.      return(TCL_ERROR);
  891.      }
  892.    else {
  893.      create_unrouted_list();
  894.      produce_frb(FRBfile);
  895.      fclose(FRBfile);
  896.      return (TCL_OK);
  897.      }
  898.    }
  899. /******************** Output a list of templates to a file ***********************/
  900. /*
  901. @title
  902. write template <filename>
  903. @application vertical_pin
  904. @application vertical_hdl
  905. @text
  906. List out all of the socket templates (alternatively these are VHDL component declarations)
  907. loaded into the VERTICAL database into a file,
  908. which can be used to create a library of templates.
  909. @end
  910. */
  911.  
  912. int WriteTemplateHandler (ET_TCLARGS)
  913.    {
  914.    FILE * Templatefile;
  915.  
  916.    if (argc < 1)
  917.      return(TCL_ERROR);
  918.  
  919.    Log(LOG_GENERAL, "# producing an Template file <%s>\n", argv[0]);
  920.    Templatefile = trap_fopen(argv[0], "w");             /* open text file for reading */
  921.    if (!Templatefile) {
  922.      Log(LOG_ERROR, "# Error opening Template output file: <%s>\n",argv[0]);
  923.      return(TCL_ERROR);
  924.      }
  925.    else {
  926.      template_list_pins(Templatefile);
  927.      fclose(Templatefile);
  928.      }
  929.    return(TCL_OK);
  930.    }
  931.    
  932. /************ Output a device by Name to file - expanding VHDL busses ********/
  933. /*
  934. @title
  935. write fit <device> <filename>
  936. @application vertical_pcb
  937. @application vertical_pin
  938. @application vertical_hdl
  939. @text
  940. Write out a device socket, and expand out busses, using the VHDL declarations
  941. of the signals connected to produce the required number of pins. These databases
  942. created can be used in the creation of an initial pin fit without the use of
  943. an FPGA fitter.
  944. @break
  945. Partitioning use : If the 'chip' appears to have VHDL busses
  946. rather than individual wires on some of its 'pins' then these
  947. busses will be expanded into unique signal names. This process
  948. is performed at the time of printout. A bus declared as
  949. @listing
  950.   fred : in STD_LOGIC (3 DOWNTO 0)
  951. in the input acfp file will be printed out as
  952.   fred_0 : INPUT_PIN :=  1_1 "STD_LOGIC"
  953.   fred_1 : INPUT_PIN :=  1_2 "STD_LOGIC"
  954.   fred_2 : INPUT_PIN :=  1_3 "STD_LOGIC"
  955.   fred_3 : INPUT_PIN :=  1_4 "STD_LOGIC"
  956. @end
  957. */
  958. int WriteFitHandler (ET_TCLARGS)
  959.    {
  960.    FILE * ACFfile;
  961.    socket_t * skt;
  962.  
  963.    if (argc < 2)
  964.      return(TCL_ERROR);
  965.  
  966.    skt = find_socket(Name,argv[0],Search,&socket_head);
  967.  
  968.    if(!skt) {
  969.      Log(LOG_GENERAL,"# Cannot find socket name '%s'\n",argv[0]);
  970.      return(TCL_ERROR);
  971.      };
  972.    Log(LOG_GENERAL, "# producing ACF for socket name '%s' in <%s>\n",
  973.         argv[0],argv[1]);
  974.    ACFfile = trap_fopen(argv[1], "w");    /* open text file for writing */
  975.    if (!ACFfile) {
  976.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[1]);
  977.      return(TCL_ERROR);
  978.      }
  979.   else {
  980.        create_unrouted_list();
  981.        print_header(ACFfile,TOOL_NAME": WRITE FIT");
  982.        print_device(ACFfile,skt, PRINT_EXPAND_BUS ); /* include pins not connected to nets */
  983.        fclose(ACFfile);
  984.        return (TCL_OK);
  985.        }
  986.     }
  987.  
  988. /******************** Output a device by ID to file ***********************/
  989. /*
  990. @title
  991. write identifier <chip_ident> <filename>
  992. @application vertical_pcb
  993. @application vertical_pin
  994. @application vertical_hdl
  995. @text
  996. Write out device info by ident  e.g. U1 or U2 . All pins that
  997. are known either on routed nets or unrouted nets will be
  998. listed. The names of the routed nets attached to the chip pins
  999. are given so that the user can detertmine which socket pins
  1000. are usable for making connections to the socket. That is all
  1001. of those that are not VCC or Ground for example.
  1002. @break
  1003. This format is exactly compatible with maxplus2 so it is used
  1004. to produce the new pin assignment files for maxplus2
  1005. It is also used to help with the creation of pin definition
  1006. files for external connectors.
  1007. @end
  1008. */
  1009. int WriteIdHandler (ET_TCLARGS)
  1010.    {
  1011.    FILE * ACFfile;
  1012.    socket_t * skt;
  1013.  
  1014.    if (argc < 2)
  1015.      return(TCL_ERROR);
  1016.    skt = find_socket(Ident,argv[0],Search,&socket_head);
  1017.  
  1018.    if(!skt) {
  1019.      Log(LOG_GENERAL,"# Cannot find socket id '%s'\n",argv[0]);
  1020.      return(TCL_ERROR);
  1021.      };
  1022.    Log(LOG_GENERAL, "# producing ACF for socket id '%s' in <%s>\n",
  1023.         argv[0],argv[1]);
  1024.    ACFfile = trap_fopen(argv[1], "w");     /* open text file for writing */
  1025.    if (!ACFfile) {
  1026.        Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[1]);
  1027.        return(TCL_ERROR);
  1028.        }
  1029.    else {
  1030.        create_unrouted_list();
  1031.        print_header(ACFfile,TOOL_NAME": WRITE ID");
  1032.        print_device(ACFfile,skt,PRINT_ALL | PRINT_USABLE ); /* include pins not connected to nets */
  1033.        fclose(ACFfile);
  1034.        }
  1035.     return (TCL_OK);
  1036.     }
  1037.  
  1038. /******************** Output a device by name to file ***********************/
  1039. /*
  1040. @title
  1041. write name <chip_name> <filename>
  1042. @application vertical_pcb
  1043. @application vertical_pin
  1044. @application vertical_hdl
  1045. @text
  1046. Write out device info for the named device/socket  (with only
  1047. pins that are used by routed nets). Tis is used for user
  1048. documentation purposes and diagnostics, in separating out
  1049. induvidual sockets from the netlist into separate files.
  1050. @text
  1051. @end
  1052. */
  1053. int WriteNameHandler (ET_TCLARGS)
  1054.    {
  1055.    FILE * ACFfile;
  1056.    socket_t * skt;
  1057.    if (argc<2)
  1058.        return(TCL_ERROR);
  1059.  
  1060.    skt = find_socket(Name,argv[0],Search,&socket_head);
  1061.  
  1062.    if(!skt) {
  1063.      Log(LOG_GENERAL,"# Cannot find socket name '%s'\n",argv[0]);
  1064.      return(TCL_ERROR);
  1065.      };
  1066.    Log(LOG_GENERAL, "# producing ACF for socket name '%s' in <%s>\n",
  1067.         argv[0],argv[1]);
  1068.    ACFfile = trap_fopen(argv[1], "w");    /* open text file for writing */
  1069.    if (!ACFfile) {
  1070.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[1]);
  1071.      return(TCL_ERROR);
  1072.      }
  1073.    else {
  1074.      create_unrouted_list();
  1075.      print_header(ACFfile,TOOL_NAME" : WRITE NAME");
  1076.      print_device(ACFfile,skt,0); /* used pins only */
  1077.      fclose(ACFfile);
  1078.      return (TCL_OK);
  1079.     } ;
  1080.   }
  1081. /******************** Output a partition name to file ***********************/
  1082. /*
  1083. @title
  1084. write VHDl <new_entityname> <filename> [ <template_file> ]
  1085. @text
  1086. Write out partition as VHDL, with the top level entity named
  1087. as the new_entityname. If a template file name is given then
  1088. the template file will be copied to filename, but where the
  1089. string '$ENT$' appears in the template file, the entity will
  1090. be inserted, and where the string '$ARCH$' appears in the
  1091. template file, the architecture will be inserted. This allows
  1092. for project specific libraries to be used and for specific
  1093. header and footer information to be provided. e.g.
  1094. @listing
  1095. Example of a VHDL template file
  1096.  
  1097. -------------------------------
  1098. -- Super dooper junk project --
  1099. -- Default template file with--
  1100. -- VERTICAL --------------------
  1101. -------------------------------
  1102. library ieee,proj_std;
  1103. use ieee.std_logic_1164.all;
  1104. use proj_std.dodgy_conversions.all;
  1105.  
  1106. -- Now an entity --
  1107. $ENT$
  1108.  
  1109. library ieee,proj_std;
  1110. use ieee.std_logic_1164.all;
  1111. use proj_std.dodgy_conversions.all;
  1112.  
  1113. -- now an architecture --
  1114. $ARCH$
  1115. @text
  1116. You will be warned if the template contains other than exactly
  1117. one $ENT$ and $ARCH$ string.
  1118. @end
  1119. */
  1120. int WriteVHDLHandler (ET_TCLARGS)
  1121.    {
  1122.    char * TemplateName;
  1123.    FILE * VHDLfile;
  1124.  
  1125.    if (argc < 2)
  1126.      return(TCL_ERROR);
  1127.  
  1128.   /* template name is optional */
  1129.    TemplateName = NULL;
  1130.    if(argc>2)
  1131.      TemplateName=argv[2];
  1132.  
  1133.  
  1134.    /* slip-up with a null pointer 17 Feb 2000  */
  1135.    if(TemplateName && strcmp(TemplateName,argv[0])==0)  {
  1136.     Log(LOG_ERROR, "# ERROR : VHDL template file name '%s' is the same as the template file name\n",
  1137.          argv[1]);
  1138.       return(TCL_ERROR);
  1139.       }
  1140.    
  1141.    Log(LOG_GENERAL, "# producing VHDL of partition for new entity name '%s' in <%s>\n",
  1142.         argv[0],argv[1]);
  1143.    VHDLfile = trap_fopen(argv[1], "w");  /* open text file for writing */
  1144.    if (!VHDLfile) {
  1145.      Log(LOG_ERROR, "# Error opening VHDL output file: <%s>\n", argv[1]);
  1146.      return(TCL_ERROR);
  1147.      }
  1148.    else { /* include a template if it exists */
  1149.      create_unrouted_list();
  1150.      produce_VHDL(VHDLfile,argv[0],TemplateName);
  1151.      fclose(VHDLfile);
  1152.      return (TCL_OK);
  1153.     } ;
  1154.   }
  1155. /******************** Output a partition name to file ***********************/
  1156. /*
  1157. @title
  1158. write VLOG <new_entityname> <filename>
  1159. @text
  1160. This is an experimental function used primarily with Certify.
  1161. It writes out a board level netlist Verilog (.vb) file with
  1162. only sockets that are set as external actually instanced. This
  1163. removes unnecessary clutter from the design, and allows for
  1164. the creation of large breadboards using VERTICAL to combine
  1165. PCBs.
  1166. @end
  1167. */
  1168. int WriteVLOGHandler (ET_TCLARGS)
  1169.    {
  1170.    char *TemplateName;
  1171.    
  1172.    FILE * VLOGfile;
  1173.    if (argc < 2)
  1174.        return(TCL_OK);
  1175.  
  1176.   /* template name is optional */
  1177.    TemplateName = NULL;
  1178.    if (argc >2)
  1179.      TemplateName = argv[2];
  1180.        
  1181.    /* slip-up with a null pointer 17 Feb 2000  */
  1182.    if(TemplateName && strcmp(TemplateName,argv[1])==0)  {
  1183.     Log(LOG_ERROR, "# ERROR : VLOG file name '%s' is the same as the template file name\n",
  1184.          argv[1]);
  1185.       return(TCL_ERROR);
  1186.       }
  1187.    
  1188.    Log(LOG_GENERAL, "# producing VLOG of partition for new entity name '%s' in <%s>\n",
  1189.         argv[0],argv[1]);
  1190.    VLOGfile = trap_fopen(argv[1], "w");  /* open text file for writing */
  1191.    if (!VLOGfile) {
  1192.      Log(LOG_ERROR, "# Error opening VLOG output file: <%s>\n", argv[1]);
  1193.      return(TCL_ERROR);
  1194.      }
  1195.    else { /* include a template if it exists */
  1196.      create_unrouted_list();
  1197.      produce_VLOG(VLOGfile,argv[0],TemplateName);
  1198.      fclose(VLOGfile);
  1199.      return (TCL_OK);
  1200.     } ;
  1201.   }
  1202. /******************** Write Extern command ***********************/
  1203. /*
  1204. @title
  1205. write EXTernal <filename>
  1206. @text
  1207.  
  1208. Write  out  all sockets set as external to a file as  a  .acfp
  1209. file.
  1210. @break
  1211. In addition a COMPONENTS block will be written
  1212. @break
  1213. This is intended to provide Vertical write extern
  1214. with an explicit tie-up between the socket ID
  1215. e.g. U1 and a device name in the socket e.g. BusChip or whatever. For example:
  1216. @listing
  1217. COMPONENTS
  1218.   BEGIN
  1219.   U1 : BusChip EPM7234 "" ;
  1220.   END;
  1221. @text
  1222. @break
  1223. In fact in many cases where write ext is used,  the contents of socket U1 will be known as device name U1.
  1224. @break
  1225. @listing
  1226. COMPONENTS
  1227.   BEGIN
  1228.   U1 : U1 EPM7234 "" ;
  1229.   END;
  1230. @text
  1231. Without this info, the tool cannot locate sockets by name using the chip identifier
  1232. as ACF files do not contain the chip identifier, only the chip name.
  1233. @break
  1234.  
  1235.  
  1236. (see set external command)
  1237. @end
  1238. */
  1239. int WriteExternHandler (ET_TCLARGS)
  1240.    {
  1241.    FILE * ACFfile;
  1242.  
  1243.    if (argc < 1)
  1244.      return(TCL_ERROR);
  1245.  
  1246.    Log(LOG_GENERAL, "# producing an ACF file <%s>\n", argv[0]);
  1247.    ACFfile = trap_fopen(argv[0], "w");             /* open text file for reading */
  1248.    if (!ACFfile) {
  1249.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[0]);
  1250.      return(TCL_ERROR);
  1251.      }
  1252.    else {
  1253.      create_unrouted_list();
  1254.      print_header(ACFfile,TOOL_NAME": WRITE EXTERN");
  1255.      list_extern_sockets(ACFfile);
  1256.      list_extern_devices(ACFfile);
  1257.      fclose(ACFfile);
  1258.      return (TCL_OK);
  1259.      }
  1260.    }
  1261. /******************** Output a device pin assignments as Xilinx Virtex UCF format ***********************/
  1262. /*
  1263. @title
  1264. write UCF <chip_ident> <filename>
  1265. @application vertical_pcb
  1266. @application vertical_pin
  1267. @application vertical_hdl
  1268. @text
  1269. Write out device info as a Xilinx Alliance (Virtex etc) UCF, naming socket
  1270. by ident  e.g. U1 or U2 . All pins that
  1271. are known either on routed nets or unrouted nets will be
  1272. listed. The names of the routed nets attached to the chip pins
  1273. are given so that the user can detertmine which socket pins
  1274. are usable for making connections to the socket. That is all
  1275. of those that are not VCC or Ground for example.
  1276. @break
  1277. This format is exactly compatible with Xilinx Alliance so it is used
  1278. to produce the new pin assignment files for Xilinx Alliance
  1279. @end
  1280. */
  1281. int WriteUCFHandler (ET_TCLARGS)
  1282.    {
  1283.    FILE * UCFfile;
  1284.    socket_t * skt;
  1285.  
  1286.    if (argc < 2)
  1287.      return(TCL_ERROR);
  1288.    skt = find_socket(Ident,argv[0],Search,&socket_head);
  1289.  
  1290.    if(!skt) {
  1291.      Log(LOG_GENERAL,"# Cannot find socket id '%s'\n",argv[0]);
  1292.      return(TCL_ERROR);
  1293.      };
  1294.    Log(LOG_GENERAL, "# producing UCF for socket id '%s' in <%s>\n",
  1295.         argv[0],argv[1]);
  1296.    UCFfile = trap_fopen(argv[1], "w");     /* open text file for writing */
  1297.    if (!UCFfile) {
  1298.        Log(LOG_ERROR, "# Error opening UCF output file: <%s>\n", argv[1]);
  1299.        return(TCL_ERROR);
  1300.        }
  1301.    else {
  1302.        create_unrouted_list();
  1303.        print_UCF_instance(UCFfile,skt,PRINT_ALL | PRINT_USABLE ); /* include pins not connected to nets */
  1304.        fclose(UCFfile);
  1305.        return (TCL_OK);
  1306.        }
  1307.     }
  1308.    
  1309. /******************** Write Sockets command ***********************/
  1310. /*
  1311. @title
  1312. write SOCkets <filename>
  1313. @text
  1314. Write  out  all sockets to a file as  a  .acfp
  1315. file.
  1316. @end
  1317. */
  1318. int WriteSocketHandler (ET_TCLARGS)
  1319.    {
  1320.    FILE * ACFfile;
  1321.  
  1322.    if (argc < 2)
  1323.      return(TCL_ERROR);
  1324.  
  1325.    Log(LOG_GENERAL, "# producing an ACF file <%s>\n", argv[0]);
  1326.    ACFfile = trap_fopen(argv[0], "w");             /* open text file for write*/
  1327.    if (!ACFfile) {
  1328.      Log(LOG_ERROR, "# Error opening ACF output file: <%s>\n", argv[0]);
  1329.      return(TCL_ERROR);
  1330.      }
  1331.    else {
  1332.      create_unrouted_list();
  1333.      print_header(ACFfile,TOOL_NAME": WRITE SOCKETS");
  1334.      list_components(ACFfile);
  1335.      fclose(ACFfile);
  1336.      return (TCL_OK);
  1337.      }
  1338.    }
  1339.  
  1340. /******************** Output a device by name to file ***********************/
  1341. /*
  1342. @title
  1343. write PAR_acf <new_entityname> <filename>
  1344. @text
  1345. Write out  partition  entity as Extended ACF so that it may be
  1346. read in as a description of the ports of the top level of a
  1347. partitiion, in conjunction with the  extended ACF files for
  1348. the other partitions in the system.
  1349. This then allows the connection together of all of the
  1350. partitioned pieces of the design back into a new toplevel
  1351. entitiy that may be simulated.
  1352. @end
  1353. */
  1354. int WriteParACFHandler (ET_TCLARGS)
  1355.    {
  1356.    FILE * Parfile;
  1357.    if (argc < 2)
  1358.        return(TCL_ERROR);
  1359.  
  1360.  
  1361.    Log(LOG_GENERAL, "# producing Extended ACF of partition for new entity name '%s' in <%s>\n",
  1362.         argv[0],argv[1]);
  1363.    Parfile = trap_fopen(argv[1], "w");  /* open text file for writing */
  1364.    if (!Parfile) {
  1365.      Log(LOG_ERROR, "# Error opening ACF+ output file: <%s>\n", argv[1]);
  1366.      return(TCL_ERROR);
  1367.      }
  1368.    else {
  1369.      create_unrouted_list();
  1370.      print_header(Parfile,TOOL_NAME" : WRITE PAR_ACF");
  1371.      print_ACF_entity(Parfile,argv[0]);
  1372.      fclose(Parfile);
  1373.      return (TCL_OK);
  1374.     } ;
  1375.   }
  1376.  
  1377.  
  1378. /******************** Output a device by name to Quartus pinfit file ***********************/
  1379. /*
  1380. @title
  1381. write quartus <chip_name> <filename>
  1382. @text
  1383. Writes out a Quartus .pin pin assignment file with reserved pins and recommended tiedown pins.
  1384. @end
  1385. */
  1386. int WriteQuartusPinfitHandler (ET_TCLARGS)
  1387.    {
  1388.    FILE * ACFfile;
  1389.    socket_t * skt;
  1390.    if (argc<2)
  1391.        return(TCL_ERROR);
  1392.  
  1393.    skt = find_socket(Name,argv[0],Search,&socket_head);
  1394.  
  1395.    if(!skt) {
  1396.      Log(LOG_GENERAL,"# Cannot find socket name '%s'\n",argv[0]);
  1397.      return(TCL_ERROR);
  1398.      };
  1399.    Log(LOG_GENERAL, "# producing Quartus pinfit for socket name '%s' in <%s>\n",
  1400.         argv[0],argv[1]);
  1401.    ACFfile = trap_fopen(argv[1], "w");    /* open text file for writing */
  1402.    if (!ACFfile) {
  1403.      Log(LOG_ERROR, "# Error opening Quartus pinfit file: <%s>\n", argv[1]);
  1404.      return(TCL_ERROR);
  1405.      }
  1406.    else {
  1407.      create_unrouted_list();
  1408.      print_header(ACFfile,TOOL_NAME" : WRITE QUARTUS");
  1409.      print_quartus_pinfit(ACFfile,skt,0); /* used pins only */
  1410.      fclose(ACFfile);
  1411.      return (TCL_OK);
  1412.     } ;
  1413.   }
  1414.  
  1415. /******************** Write PinList *************************/
  1416. /*
  1417. @title
  1418. write pinlist <socket_id*> <chip_id> [ <filename> ]
  1419. @text
  1420. Writes out a pinlist for the connections of socket(s) to an fpga. This is written to a file as HTML.
  1421. It also writes the pin index created by the 'bundle' command if this has been used on a socket.
  1422. @break
  1423. This command is extremely useful for checking pin assignments
  1424. @listing
  1425. write fit x.*_a u1_a u1_a.html
  1426. @text
  1427. This lists all of the pinouts of connectors 'x' on board '_a' which are
  1428. connected to 'u1_a'.
  1429. @end
  1430. */
  1431.  
  1432. int WritePinlistHandler (ET_TCLARGS)
  1433.    {
  1434.    FILE * ACFfile;
  1435.    if (argc<2)
  1436.        return(TCL_ERROR);
  1437.    if (argc>2)
  1438.      ACFfile = trap_fopen(argv[2], "w");    /* open text file for writing */
  1439.    else
  1440.      ACFfile = stdout;
  1441.  
  1442.    if (!ACFfile) {
  1443.      Log(LOG_ERROR, "# Error opening Pinlist file: <%s>\n", argv[2]);
  1444.      return(TCL_ERROR);
  1445.      }
  1446.    else
  1447.      {
  1448.       list_intersection(ACFfile,argv[0], argv[1]) ;
  1449.      if(ACFfile!=stdout)
  1450.        {
  1451.        fclose(ACFfile);
  1452.        }
  1453.      }
  1454.    if(ACFfile!=stdout)
  1455.      {
  1456.      fclose(ACFfile);
  1457.      }
  1458.    return TCL_OK;
  1459.    } ;
  1460.  
  1461.  
  1462. /******************** Write xxx Menu  ***********************/
  1463.  
  1464.   CommandMenu WriteMenu = {
  1465.     {"acf",       3, WriteAcfHandler,NULL,
  1466.                      "Write out an 'Extended ACF' file",
  1467.                      "<filename>",NULL},
  1468.     {"connected",       3, WriteConnectedHandler,NULL,
  1469.                      "Write out an 'Extended ACF' file, with all connected pins",
  1470.                      "<filename>",NULL},
  1471.     {"net",       3, WriteNetHandler,NULL,
  1472.                      "Write out an 'Extended ACF' file, just the netlist part",
  1473.                      "<filename>",NULL},
  1474.     {"pcb",       3, WriteFrbHandler,NULL,
  1475.                      "Write out an 'FRB' PCB netlist file",
  1476.                      "<filename>",NULL},
  1477.     {"pinlist",2,    WritePinlistHandler,NULL,
  1478.                      "Write out Pin list for socket crossreferenced to FPGA",
  1479.                      "<socket ident> <fpga ident> <filename>",NULL},
  1480.  
  1481.     {"identifier",2, WriteIdHandler,NULL,
  1482.                      "Write out device info by ident. (with all pins)",
  1483.                      "<ident> <filename>",NULL},
  1484.     {"name",      3, WriteNameHandler,NULL,
  1485.                      "Write out device info by Name (with used pins)",
  1486.                      "<name> <filename>",NULL},
  1487.     {"fit",      3,  WriteFitHandler,NULL,
  1488.                      "Write out device info by Name (with Expanded VHDL busses)",
  1489.                      "<name> <filename>",NULL},
  1490.     {"flatten",  3,  WriteFlattenHandler,NULL,
  1491.                      "Write out Flattened (no jumpers) netlist",
  1492.                      "<filename>",NULL},
  1493.     {"extern",    3, WriteExternHandler,NULL,
  1494.                      "Write sockets with external connection flags set ",
  1495.                      "<filename>",NULL},
  1496.     {"quartus",    3, WriteQuartusPinfitHandler,NULL,
  1497.                      "Write Quartus pinfit file",
  1498.                      "<name> <filename>",NULL},
  1499.     {"sockets",    3, WriteSocketHandler,NULL,
  1500.                      "Write socket list to file ",
  1501.                      "<filename>",NULL},
  1502.     {"template",    3, WriteTemplateHandler,NULL,
  1503.                      "Write socket templates",
  1504.                      "<filename>",NULL},
  1505.     {"ucf",        3, WriteUCFHandler,NULL,
  1506.                      "Write Xilinx User configuration pin assignments",
  1507.                      "<ident> <filename>",NULL},
  1508.     {"vhdl",      3, WriteVHDLHandler,NULL,
  1509.                      "Write out partition as VHDL",
  1510.                      "<new_entityname> <filename> [<template VHDL>]",NULL},
  1511.     {"vlog",      3, WriteVLOGHandler,NULL,
  1512.                      "Write out partition as Verilog",
  1513.                      "<new_entityname> <filename> [<template Verilog>]",NULL},
  1514.     {"par_acf",      3, WriteParACFHandler,NULL,
  1515.                      "Write out partition entity as Extended ACF",
  1516.                      "<new_entityname> <filename>",NULL},
  1517.     { NULL,0,        NULL,NULL,NULL,NULL,NULL } ,
  1518.  
  1519.     };
  1520.  
  1521.  
  1522.  
  1523. /*********************** List components Command  ***************************/
  1524. /* this lists all of the sockets to standard output */
  1525. /*
  1526. @title
  1527. list SOCkets
  1528. @text
  1529. List all of the known components in acfp form to standard output
  1530. @end
  1531. */
  1532. int ListSktHandler(ET_TCLARGS)
  1533. {
  1534.   list_components(stdout);
  1535.   return(TCL_OK);
  1536. }
  1537. /*********************** List components Command  ***************************/
  1538. /* this lists all of the sockets to standard output */
  1539. /*
  1540. @title
  1541. list RENames
  1542. @text
  1543. List all of the pin renames in ACFP form to standard output
  1544. @end
  1545. */
  1546.  
  1547. int ListRenamesHandler(ET_TCLARGS)
  1548. {
  1549.   print_pin_renames(stdout);
  1550.   return(TCL_OK);
  1551. }
  1552. /*********************** List joins Command  ***************************/
  1553. /* this lists all of the joins to standard output */
  1554. /*
  1555. @title
  1556. list JOIn
  1557. @text
  1558. List all of the netlist joins (jumpers and aliases) in ACFP form to standard output
  1559. @end
  1560. */
  1561.  
  1562.  
  1563. int ListJoinHandler(ET_TCLARGS)
  1564. {
  1565.   list_joined(stdout);
  1566.   return(TCL_OK);
  1567. }
  1568. /*********************** List partition Command  ***************************/
  1569. /* this lists all of the joins to standard output */
  1570. /*
  1571. @title
  1572. list PARtition
  1573. @text
  1574. List out to standard output all of the entities currently selected to to combine
  1575. in the top level entitiy when the partition is created
  1576. @end
  1577. */
  1578.  
  1579. int ListPartHandler(ET_TCLARGS)
  1580. {
  1581.   list_partition(stdout);
  1582.   return(TCL_OK);
  1583. }
  1584.  
  1585. /*********************** List xref Command  ***************************/
  1586. /* this lists all of the links from one socket to another
  1587.    to standard output */
  1588. /*
  1589. @title
  1590. list XREF [<chip_id>]
  1591. @text
  1592. List cross references between this socket and all other named
  1593. sockets. The number of nets will be given, for each of the net
  1594. lists used by VERTICAL.
  1595. @listing
  1596. EPLD tool : list xref b*
  1597. -- Listing xref for socket names 'b*' --
  1598. --  Cross reference for socket 'Bcu'
  1599. Name            : Named&Used, Named, Routed,Unrouted
  1600.              Bcu :    106,    16,  2419,     4
  1601.          unused1 :      0,    78,     0,     0
  1602.         test_par :     92,     0,  2312,     0
  1603.          unused2 :      0,    78,     0,     0
  1604.       bcu_x101_a :      2,     5,   526,     1
  1605.  test_par_x111_a :      1,    60,   476,     0
  1606.  test_par_x112_a :      0,    12,   473,     0
  1607.   mips_connector :      0,     0,   471,     0
  1608.   simm_connector :     16,     2,   478,     0
  1609.     pi_bus_clock :      1,     0,    39,     0
  1610.       mips_clock :      0,     0,    39,     0
  1611. @text
  1612. The example above shows the '*' wildcard used to indcate all
  1613. named sockets with names beginning wiith 'b'. Name matching is
  1614. case insensitive.
  1615. @break
  1616. If the template name given is blank then all sockets will be
  1617. listed regardless of whether they are named, cross referenced
  1618. to named sockets. A large amount of meaningless data will be
  1619. obtained in this way.
  1620. @break
  1621. If the template name given is '*' then all named sockets are
  1622. cross-referenced.
  1623. @break
  1624. The command may be used both in partitioning and in general
  1625. PCB routing.
  1626. @break
  1627. Before partition, the cross reference  connection count is
  1628. calculated via interpretation of the array range given in the
  1629. component entity declaration  e.g. std_ulogic_vector ( 6
  1630. downto 0 ) will be seen as 7 wires when doing a partition, and
  1631. when the list xref command is given.
  1632. @break
  1633. After partition  and synthesis all signals become one physical
  1634. wire or an array of discrete wires given as separate signals
  1635. in any case.
  1636. @end
  1637. */
  1638.  
  1639.  
  1640. int ListXrefHandler(ET_TCLARGS)
  1641. {
  1642.   char * SocketName;
  1643.   SocketName = NULL; /* no names given, pass null pointer down */
  1644.   if (argc >0)
  1645.     SocketName = argv[0];    
  1646.   count_paths(SocketName);
  1647.   return(TCL_OK);
  1648. }
  1649. /*********************** List Templates Command  ***************************/
  1650. /* this lists all of the available socket templates */
  1651. /*
  1652. @title
  1653. list TEMplates
  1654. @text
  1655. List out all of the CHIP pin templates (or VHDL components) that are available (the
  1656. device types)
  1657. @end
  1658. */
  1659. int ListTemplHandler(ET_TCLARGS)
  1660. {
  1661.   template_list();
  1662.   return(TCL_OK);
  1663. }
  1664. /*********************** List Generic Command  ***************************/
  1665. /* this lists all of the global generic values */
  1666. /*
  1667. @title
  1668. list GENerics
  1669. @text
  1670. List out all of the generics (variables)
  1671. @end
  1672. */
  1673. int ListGenericHandler(ET_TCLARGS)
  1674. {
  1675.   Log(LOG_GENERAL,"-- partition generics\n");
  1676.   list_generic_values(stdout,&partition_generics,0);
  1677.   Log(LOG_GENERAL,"-- global generics\n");
  1678.   list_generic_values(stdout,&global_generics,0);
  1679.   return(TCL_OK);
  1680. }
  1681. /*********************** List Unrouted Command  ***************************/
  1682. /* this lists all of the unrouted nets */
  1683. /*
  1684. @title
  1685. list UNRouted
  1686. @text
  1687. List out all of the currently unrouted nets. Use after ROUTE command to highlight those nets still not
  1688. routed.
  1689. @end
  1690. */
  1691. int ListUnroutedHandler(ET_TCLARGS)
  1692. {
  1693.   if(unrouted_list) {  
  1694.     fprintf(stdout,"-- Unrouted nets follow --\n");
  1695.     list_nets(stdout,unrouted_list,0);
  1696.     }
  1697.   else
  1698.     fprintf(stdout,"-- Currently no unrouted nets --\n");
  1699.      
  1700.   return(TCL_OK);
  1701. }
  1702.  
  1703. /*********************** List Net Command  ***************************/
  1704. /* this lists all of the nodes on the named net */
  1705. /*
  1706. @title
  1707. list NET <netname>
  1708. @text
  1709. Locates the named net, informs of which netlist it is found on, and then gives the node list of the net (devices visited).
  1710. @end
  1711. */
  1712.  
  1713. int ListNetHandler(ET_TCLARGS) {
  1714.   net_t * Net;
  1715.   if(argc > 0) {
  1716.  
  1717.     Net = find_net(&named_list,
  1718.                         Name,
  1719.                         argv[0],
  1720.                         Search);
  1721.     if(Net)
  1722.       Log(LOG_GENERAL,"-- Net on named list\n");
  1723.     else {
  1724.         Net = find_net(&routed_list,
  1725.                         Name,
  1726.                         argv[0],
  1727.                         Search);
  1728.       if(Net)
  1729.         Log(LOG_GENERAL,"-- Net on routed list\n");
  1730.       else {
  1731.         Net = find_net(&unrouted_list,
  1732.                         Name,
  1733.                         argv[0],
  1734.                         Search);
  1735.         if(Net)
  1736.           Log(LOG_GENERAL,"-- Net on unrouted list\n");
  1737.                        
  1738.         }
  1739.       }
  1740.    if(Net)
  1741.      list_net_structure(stdout, Net,Net,0,0);
  1742.    };
  1743.   return(TCL_OK);
  1744.   }
  1745.  
  1746.  
  1747.  
  1748. /*********************** List Command  ***************************/
  1749.  
  1750.   CommandMenu ListMenu= {
  1751.     {"sockets",    3, ListSktHandler,NULL,
  1752.                      "List all known sockets",
  1753.                      "",NULL},
  1754.     {"joined",     3, ListJoinHandler,NULL,
  1755.                      "List all joined nets",
  1756.                      "",NULL},
  1757.     {"xref",       3, ListXrefHandler,NULL,
  1758.                      "List cross reference",
  1759.                      "<socket_name>",NULL},
  1760.  
  1761.     {"partition",  3, ListPartHandler,NULL,
  1762.                      "List current partition",
  1763.                      "",NULL},
  1764.     {"templates",  3, ListTemplHandler,NULL,
  1765.                      "List IC templates",
  1766.                      "",NULL},
  1767.     {"generics",  3, ListGenericHandler,NULL,
  1768.                      "List Global Generics",
  1769.                      "",NULL},
  1770.     {"renames",   3, ListRenamesHandler,NULL,
  1771.                      "List Pin Renames",
  1772.                      "",NULL},
  1773.     {"unrouted",   3, ListUnroutedHandler,NULL,
  1774.                      "List Unrouted nets ",
  1775.                      "",NULL},
  1776.     {"net",   3, ListNetHandler,NULL,
  1777.                      "List nodes on net",
  1778.                      "<netname>",NULL},
  1779.  
  1780.     { NULL,0,        NULL,NULL,NULL,NULL,NULL } ,
  1781.     };
  1782.  
  1783.  
  1784. /*********************** Connection handler  ***************************/
  1785. /* connects the two sockets pin for pin */
  1786. /*
  1787. @title
  1788. CONNect <socket_id1> <socket_id2>
  1789. @text
  1790.  
  1791. This command provides a means for automatically jumpering
  1792. together all pins on a pair of sockets. This connection is
  1793. different to the jumper command.
  1794. @break
  1795. The connection command simply takes two sockets and connects
  1796. up their pins in the routed metal netlist with the pins
  1797. completely in order. This is what happens when two sockets are
  1798. mated rather than a set of wirewrap jumpers being used to
  1799. connect the sockets.
  1800. @break
  1801. In order for this to work, the sockets must have pin
  1802. connections that can be found on the routed list : in other
  1803. words, they are connected via metal connections to other
  1804. sockets. Use of 'route' commands may be needed on some
  1805. occasions in order to create the metal connection netlist from
  1806. e.g. a list of sockets with assigned pins.
  1807. @break
  1808. Once the command is issued, the software takes each pin in
  1809. turn on <socket_id1> and searches for the pin with the same
  1810. identifier on <socket_id2>.
  1811. @break
  1812. If this pin is found then a jumper is created, even if the
  1813. nets that the sockets are on are already jumpered to something
  1814. else. This jumper created will have the identifier created by
  1815. the concatenation of the socket identifiers and the pin
  1816. identifiers : something like :
  1817. cn_<socket_id1>_<socket_id2>_<pin_id>
  1818. @break
  1819. This command facilitates the connection together of different
  1820. PCBs. If it is known that a connection cable (or X-PCB) is to
  1821. be used which has a different connection pattern and/or
  1822. connector type at each end of the cable, then it would be
  1823. possible to manually create a netlist for the cable as though
  1824. it were a PCB , with two sockets on it with appropriately
  1825. connected via routed nets.
  1826. @break
  1827. Reading this PCB in (using the socket/net name suffixing
  1828. feature of VERTICAL) and then issuing connection commands for
  1829. each socket pair (one for each end of the new cable) will
  1830. result in the desired set of jumpers being created.
  1831. e.g.
  1832. @break
  1833. A script to be executed by VERTICAL
  1834. @listing
  1835. # Crossover script
  1836. read conn_net _a
  1837. read conn_net _b
  1838. write acf cross_net0
  1839.  
  1840. # read in the connectors (have X1 and X2)
  1841. read xc_pcb _a
  1842. read xc_pcb _b
  1843. # the main file has sockets ID1 and ID2 on it. Because they
  1844. are read in
  1845. # with name suffixes _a and _b they are distinct.
  1846. # use the connector betweeen id1 on PCB _a and id1 on PCB _b
  1847. con id1_a x1_a
  1848. con id1_b x2_a
  1849. # use the connector betweeen id2 on PCB _a and id2 on PCB _b
  1850. con id2_a x1_b
  1851. con id2_b x2_b
  1852.  
  1853. write acf cross_net
  1854. Example of an acfp file describing a 4 way crossover (xc_pcb)
  1855. COMPONENTS
  1856. BEGIN
  1857.   X1 : "test1" "PLUG4" "";
  1858.   X2 : "test2" "PLUG4" "";
  1859. END;
  1860.  
  1861. WIRED_NETS
  1862. BEGIN
  1863. CONNECTION "c1" "" CREATED_NET;
  1864. X1(4); X2(1);
  1865.  END_CONN;
  1866.  CONNECTION "c2" "" CREATED_NET;
  1867. X1(3); X2(2);
  1868.  END_CONN;
  1869.  CONNECTION "c3" "" CREATED_NET;
  1870. X1(2); X2(3);
  1871.  END_CONN;
  1872.  CONNECTION "c4" "" CREATED_NET;
  1873. X1(1); X2(4);
  1874.  END_CONN;
  1875. END;
  1876.  
  1877. @end
  1878. */
  1879.  
  1880.  
  1881. int ConnectionHandler(ET_TCLARGS)
  1882. {
  1883.   if (argc < 2)
  1884.      return(TCL_ERROR);
  1885.   create_all_jumpers(argv[0],argv[1]);
  1886.   return(TCL_OK);
  1887. }
  1888.  
  1889.  
  1890.  
  1891.  
  1892.