Subversion Repositories Vertical

Rev

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

  1. /*
  2.  * $id: c:\\cygwin\\cvsroot/vertical/cmdexec2.c,v 1.26 2001/10/31 16:23:22 mjames Exp $
  3.  *
  4.  * $Log: cmdexec2.c,v $
  5.  * Revision 1.1.1.1  2003/11/04 23:34:57  mjames
  6.  * Imported into local repositrory
  7.  *
  8.  * Revision 1.40  2003/01/02 21:37:14  mjames
  9.  * Experiment on creating NOT_ROUTABLE_H and NOT_ROUTABLE_L
  10.  * properties on the nets so that pin jumpers can be made without a problem.
  11.  *
  12.  * Still need to sort out pin assignments made to these not_routable nets
  13.  * which will become legal in some cases so that pullups and pulldown
  14.  * pins can be used on the FPGA.
  15.  *
  16.  * Revision 1.39  2002/09/30 13:23:53  MJAMES
  17.  * Tidied up the set par , set all_par and del par commands to make them
  18.  * all consistent with each other.
  19.  *
  20.  * Revision 1.38  2002/09/09 10:20:31  mjames
  21.  * Removed set generic range and replaced it with a set generic value command
  22.  * that takes both integers and ranges.
  23.  *
  24.  * Revision 1.37  2002/08/23 14:20:09  mjames
  25.  * Added Require command,
  26.  * modified edit ident and edit type commands comments to be more
  27.  * helpful.
  28.  *
  29.  * Revision 1.36  2002/08/06 12:53:03  mjames
  30.  * Merge in from latest version
  31.  *
  32.  * Revision 1.36  2002/03/08 14:56:14  mjames
  33.  * Edited all of the commands in the cmdexec1.c and cmdexec2.c files
  34.  * so that they can be read by doc2.pl
  35.  *
  36.  * Revision 1.35  2001/12/24 21:13:59  mjames
  37.  * Added header includes to get correct declarations for all functions
  38.  * called from command handlers
  39.  *
  40.  * Revision 1.34  2001/12/24 20:08:11  mjames
  41.  * Added more information about ensure template command to help message
  42.  *
  43.  * Revision 1.33  2001/12/11 20:32:45  mjames
  44.  * Implemented  regular expression pin  name editing
  45.  *
  46.  * Revision 1.32  2001/11/19 10:41:53  mjames
  47.  * Merged back DTC release
  48.  *
  49.  * Revision 1.31  2001/11/19 10:39:47  mjames
  50.  * Merge conflict resolution
  51.  *
  52.  * Revision 1.30  2001/11/09 22:14:44  mjames
  53.  * Added in delete chip node connection command
  54.  * In order to remove small number of chip pins in a large board
  55.  * which have been damaged.
  56.  *
  57.  * Revision 1.29.2.1  2001/11/16 15:12:23  mjames
  58.  * Altered modify_names command in response to TH request.
  59.  *
  60.  * Revision 1.29  2001/11/01 11:08:05  mjames
  61.  * Changed help message on extract_templates call
  62.  *
  63.  * Revision 1.28  2001/10/31 22:28:27  mjames
  64.  * Problems with regular expression argument lists.
  65.  *
  66.  * Revision 1.27  2001/10/31 22:20:00  mjames
  67.  * Tidying up problematical comments caused by CVS
  68.  * 'intelligent' comment guessing
  69.  *
  70.  * Revision 1.26  2001/10/31 16:23:22  mjames
  71.  * Added a datastructure to hide regular expression information from programs.
  72.  * Changed call to regexec to indicate 0 subexpressions to be matched
  73.  * rather than a number dependent on strlen(string) which was wrong.
  74.  *
  75.  * Revision 1.25  2001/10/23 21:14:28  mjames
  76.  * Added match_template command : purpose to remove connections
  77.  * to device pins which do not exist in the template of that device.
  78.  *
  79.  * Modified set type_id to use wildcards (the only case where this applies)
  80.  *
  81.  * Revision 1.24  2001/10/18 21:36:01  mjames
  82.  * Added modify pins command : nets inherit identifier from selected socket and pin on that socket to ease cross referencing.
  83.  *
  84.  * Revision 1.23  2001/10/11 16:10:17  mjames
  85.  * Corrections to the SWAP command, and printout so that
  86.  * WRITE net now outputs all chips in the design so that their generics
  87.  * can be passed forward to the next phase.
  88.  *
  89.  * Revision 1.22  2001/10/10 20:19:19  mjames
  90.  * added echoq command to give quoted arguments for checking
  91.  *
  92.  * Revision 1.21  2001/10/07 20:50:54  mjames
  93.  * Added wildcard checking (warn user about
  94.  * using wildcard '*' on the end of a string in stead of wildcard '.*')
  95.  *
  96.  * Revision 1.20  2001/10/02 20:55:18  mjames
  97.  * Edited help files to try and get them more up to date.
  98.  *
  99.  * Revision 1.19  2001/09/25 23:15:24  mjames
  100.  * Converted wildcards to use proper regexp pattern match library
  101.  *
  102.  * Revision 1.18  2001/09/13 21:08:54  mjames
  103.  * Added initial bundle/unbundle commands.
  104.  *
  105.  * Revision 1.17  2001/08/23 21:34:27  mjames
  106.  * Added version command to list out all of the tags
  107.  *
  108.  * Revision 1.16  2001/08/23 20:34:12  mjames
  109.  * Made sure that attempts to create duplicate socket identifiers or names fails with the set id and set name commands.
  110.  *
  111.  * Revision 1.15  2001/08/23 20:06:30  mjames
  112.  * Added 'reserve' command for use with preroute commands.
  113.  * This command provides the 'correct' documented pin reservation
  114.  * behaviour.
  115.  *
  116.  * Revision 1.14  2001/07/20 10:47:43  mjames
  117.  * Allowed setting of pin routing group properties on pins on nets
  118.  * by the "set pin" command
  119.  *
  120.  * Revision 1.13  2001/07/02 21:21:31  mjames
  121.  * Added logging to standard output as well as standard error
  122.  * in the 'echoe' command
  123.  *
  124.  * Revision 1.12  2001/06/21 10:52:43  mjames
  125.  * Added "echoe" command which echos an error string to the output file.
  126.  * Also added command documentation for some more of the command line commands.
  127.  *
  128.  * Revision 1.11  2001/06/19 05:24:34  mjames
  129.  * Created a trap_fopen to overcome trying to write to read only files.
  130.  * If this attempted in NT the file can be opened but not written to.
  131.  *
  132.  * Revision 1.10  2001/06/06 12:10:25  mjames
  133.  * Move from HPUX
  134.  *
  135.  * Revision 1.9  2001/04/09 14:58:29  mjames
  136.  * Added capability to delete generics from specific sockets.
  137.  *
  138.  * Revision 1.8  2001/04/06 22:47:01  mjames
  139.  * Added doc2, the creator of documentation to Vertical scripts uses PERL
  140.  *
  141.  *
  142.  * Also correcting generic behaviour and the printing of Verilog.
  143.  *
  144.  * Revision 1.7  2001/04/04 22:12:31  mjames
  145.  * Added some online documentation to the C program command handler
  146.  * THis is scanned by a utility called 'doc' that currently creates
  147.  * simple HTML from part formatted C comments
  148.  *
  149.  * Also working well on printing VERILOG
  150.  *
  151.  * still have problems with C comments and VERTICAL pragmas.
  152.  *
  153.  * Revision 1.6  2001/03/29 22:08:55  mjames
  154.  * Modified to define the scope of set generic commands : now can be global
  155.  * or defined for a socket or a simple wildcarded list of sockets.
  156.  *
  157.  * In addition the is_FPGA property has been activated so that FPGA components
  158.  * are not listed out when used in a Verilog (.vb) file.
  159.  *
  160.  * Version raised to 11.02
  161.  *
  162.  * Revision 1.5  2001/01/26 21:50:10  mjames
  163.  * Managed to get vertical non TCL to compile again
  164.  *
  165.  * Conversion to argv, argc[] mode of operation continues
  166.  *
  167.  * Revision 1.4  2001/01/04 21:26:54  mjames
  168.  * Modifications to add in the TCL style
  169.  * argument list to all of the functions
  170.  * .
  171.  *
  172.  * Revision 1.3  2001/01/02 07:53:51  mjames
  173.  * Made changes to allow for interface with TCL/Tk
  174.  *
  175.  * Revision 1.2  2000/11/29 23:25:39  mjames
  176.  * Corrected a failure to cope with integer type ports on entities
  177.  * in acf_yacc.y
  178.  *
  179.  * Altered the elaborate command to call up the template command aw well
  180.  *
  181.  * Altered equivalent pins handler to cope with the absence of any templates
  182.  *
  183.  * Altered printout routines to use correct datatype for expansion of
  184.  * VHDL constants
  185.  *
  186.  * Revision 1.1.1.1  2000/10/19 21:58:35  mjames
  187.  * Mike put it here
  188.  *
  189.  *
  190.  *
  191. *****************************************************************************/
  192.  
  193. #include <stdio.h>
  194. #include <stdlib.h>
  195. #include <string.h>
  196. #include <ctype.h>
  197. #include <sys/types.h>
  198. #include <regex.h>
  199.  
  200. #include "vertcl_main.h"
  201. #include "expression.h"
  202. #include "generic.h"
  203. #include "database.h"
  204. #include "printout.h"
  205. #include "routing.h"
  206. #include "jumpering.h"
  207. #include "ext_nets.h"
  208. #include "statistics.h"
  209. #include "partition.h"
  210. #include "cmdparse.h"
  211. #include "cmdexec.h"
  212. #include "cmdutil.h"
  213. #include "cmdlog.h"
  214. #include "rename.h"
  215. #include "template.h"
  216. #include "chck_names.h"
  217. #include "acf_yacc.h"
  218. #include "sorting.h"
  219. #include "bundle.h"
  220. #include "equivalent.h"
  221. #include "unrouted.h"
  222. #include "acf_lex_ext.h"
  223.  
  224. #ident "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/cmdexec2.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $"
  225.  
  226.  
  227.  
  228. /************************************************************************/
  229. /* Command handling code                                                */
  230. /************************************************************************/
  231.  
  232.  
  233. /*********************** Set id (of) <name> (to) <id>Command  ***************************/
  234. /*
  235. @title
  236. set ID_of_name <device_name> <new_id>
  237. @application vertical_pin
  238. @application vertical_pcb
  239. @text
  240. Set Identifier for Name. Change the identifier for a named
  241. socket. This is used when VERTICAL invents identifiers e.g.
  242. 'ID1', and you would rather call it e.g. 'U101'.
  243. Assuming chip 'multiplier' is in socket 'ID1'
  244. @listing
  245. set id multiplier U101
  246. @text
  247. Command will fail if there is already a device with the new
  248. identifier.
  249. @end
  250. */
  251. int SetIdOfNameHandler(ET_TCLARGS)
  252. {
  253.   socket_t * chip;
  254.    if (argc < 2)
  255.        return(TCL_ERROR);
  256.  
  257. /* safety catch code added : is the ident already in use ? */
  258.    chip = find_socket(Ident,argv[1],Search,&socket_head);
  259.    if(chip) {
  260.      Log(LOG_ERROR,"Changing socket id for name='%s' fails : id '%s' in use already\n",argv[0],argv[1]);
  261.      return (TCL_ERROR);
  262.      };
  263.    
  264.    chip = find_socket(Name,argv[0],Search,&socket_head);
  265.    if(!chip) {
  266.      Log(LOG_ERROR,"Changing ID: Cannot find socket with name='%s'\n",argv[0]);
  267.      return (TCL_ERROR);
  268.      };
  269.    set_socket(chip,Ident,argv[1]);
  270.    Log(LOG_GENERAL,"# Set ident of socket name='%s' to be '%s'\n",argv[0],argv[1]);
  271.    return(TCL_OK);
  272.  
  273. }
  274. /*********************** Set type (of) <name> (to) <type> Command  ***************************/
  275. /*
  276. @title
  277. set TYpe_name <device_name> <new_type>
  278. @text
  279. @application vertical_pin
  280. @application vertical_hdl
  281. @application vertical_pcb
  282. Provides a means of assigning a device type to a socket where
  283. the socket contains a design e.g. an FPGA. This can then be
  284. used to tag sockets for the application of pin templates.
  285. @end
  286. */
  287. int SetTypeOfNameHandler(ET_TCLARGS)
  288. {
  289.   socket_t * chip;
  290.   if (argc < 2)
  291.        return(TCL_ERROR);
  292.    chip = find_socket(Name,argv[0],Search,&socket_head);
  293.    if(!chip) {
  294.      Log(LOG_GENERAL,"Cannot find socket with name='%s'\n",argv[0]);
  295.      return (TCL_ERROR);
  296.      };
  297.    set_socket(chip,Type,argv[1]);
  298.    Log(LOG_GENERAL,"# Set type of socket name='%s' to be '%s'\n",argv[0],argv[1]);
  299.    return(TCL_OK);
  300.  
  301. }
  302. /*********************** Set type (of) <ident> (to) <type> Command  ***************************/
  303. /*
  304. @title
  305. set TYPE_Id <device_id> <new_type>
  306. @application vertical_pin
  307. @application vertical_hdl
  308. @application vertical_pcb
  309. @text
  310. Provides a means of assigning a device type to a socket where
  311. the socket does not necessarily contain a design e.g. a
  312. resistor pack. This can then be used to tag sockets for the
  313. application of pin templates. This has been converted to wildcard usage, as this means
  314. all Rxxx can be made type 'resistor'.
  315.  
  316. @end
  317. */
  318. int SetTypeOfIDHandler(ET_TCLARGS)
  319. {
  320.   socket_t * skt;
  321.   int rc;
  322.   /* compile regular expression */
  323.   vert_regex_t * preg;
  324.   char * pattern;
  325.  
  326.   if(argc < 2 )
  327.     {
  328.     Log(LOG_ERROR,"-- Need a device ID and a type\n");
  329.     return(TCL_ERROR);
  330.     }
  331.  
  332.   pattern = argv[0];  
  333.   Log(LOG_GENERAL,"-- Beginning setting pin template: prefix '%s' --\n",pattern);
  334.  
  335.   rc = vert_regcomp(&preg,pattern);
  336.  
  337.   if (rc != 0 )
  338.     {
  339.     char errbuff[100];
  340.     regerror(rc,preg->preg,errbuff,100);
  341.     Log(LOG_ERROR,"-- Problem (rc=%d) %s with '%s' as regular expression\n",rc,errbuff,pattern);
  342.    
  343.     return TCL_ERROR;
  344.     }
  345.   else
  346.     {
  347.     Log(LOG_GENERAL,"-- Using '%s' as match pattern\n",pattern);
  348.     }
  349.  
  350.   skt = socket_head;
  351.   while(skt)
  352.     {
  353.     int found;
  354.     found  = regexec(preg->preg,skt->identifier,0,preg->regpatt,0);
  355.  
  356.  
  357.     if(!found)
  358.       {
  359.       set_socket(skt,Type,argv[1]);
  360.       if(level & 1)
  361.         {
  362.         Log(LOG_GENERAL,"# Set type of socket Ident='%s' to be '%s'\n",skt->identifier,argv[1]);
  363.         }
  364.       }
  365.     skt = skt->next;
  366.     }
  367.    vert_regfree(&preg);
  368.    return(TCL_OK);
  369.  
  370.   }
  371. /*********************** Set Partition Command  ***************************/
  372. /*
  373. @title
  374. set PARtition <socket_name> <socket_name> ......
  375. @application vertical_pin
  376. @application vertical_hdl
  377. @application vertical_pcb
  378. @text
  379. Sets partition list to be the following named chip sockets,
  380. the names being those used in the CHIP declarations in the
  381. acfp file. Wildcarding can be used to select related groups of
  382. sockets. All this does is select a socket/entity as being a member of the
  383. set of socket/entities that will be selected in this partition.
  384. @break
  385. @If no arguments are given this is the same as the set all_par command, in that
  386. It routes the design before selecting the partition
  387. @end
  388. */
  389. int SetPartHandler(ET_TCLARGS) {
  390.   int i = 0;
  391.   int Status = TCL_OK;
  392.   if(argc == 0)
  393.     {
  394.     name_routed_nets();
  395.     Status = set_clear_partition(".*",1);
  396.     }
  397.   else
  398.     {
  399.     for(i=0;i<argc && Status == TCL_OK;i++)
  400.       {
  401.       Status = set_clear_partition(argv[i],1);
  402.       }
  403.     }
  404.   if(Status != TCL_OK)
  405.     {
  406.     Log(LOG_ERROR,"-- ERROR with pattern '%s'\n",argv[i]);
  407.     }
  408.   return(TCL_OK);
  409.   }
  410.  
  411. /*********************** Set Partition Command  ***************************/
  412. /*
  413. @title
  414. set all_par
  415. @application vertical_hdl
  416. @text
  417. All sockets are selected for the partition. This can be used
  418. as part of the process of creating a top level wrapper for the
  419. entire design in VHDL.
  420. @break
  421. This is now no different from
  422. @listing
  423. set partition
  424. @end
  425. */
  426. int SetPartAllHandler(ET_TCLARGS)
  427. {
  428.   name_routed_nets();
  429.   return set_clear_partition(".*",1);
  430. }
  431.  
  432. /*********************** Set name (of)  <id> (to) <name> Command  ***************************/
  433. /*
  434. @title
  435. set NAme_of_id <device_id> <new_name>
  436. @application vertical_pin
  437. @application vertical_hdl
  438. @application vertical_pcb
  439. @text
  440. Sets name for socket identified by identifier e.g. 'U1' etc.
  441. This is used as a means of assigning chip names given in CHIP
  442. declarations in an ACF file to actual PCB socket positions. It
  443. is usable as an alternative to the COMPONENTS block in the
  444. ACFplus file.
  445. @break
  446. One an ACFplus file is written (write acf) then the COMPONENTS
  447. block will be updated with the CHIP to socket assignment given
  448. by this command.
  449. @break
  450. Fails if the name is already in use in the design.
  451. @end
  452. */
  453. int SetNameOfIdHandler(ET_TCLARGS)
  454. {
  455.   socket_t * chip;
  456.    if (argc < 2)
  457.        return(TCL_ERROR);
  458.  
  459. /* safety catch code added : is the name already in use ? */
  460.    chip = find_socket(Name,argv[1],Search,&socket_head);
  461.    if(chip) {
  462.      Log(LOG_ERROR,"Renaming socket id='%s' fails : name '%s' in use already\n",argv[0],argv[1]);
  463.      return (TCL_ERROR);
  464.      };
  465.    
  466.  
  467.  
  468.    chip = find_socket(Ident,argv[0],Search,&socket_head);
  469.    if(!chip) {
  470.      Log(LOG_ERROR,"Cannot find socket with ident='%s' to rename\n",argv[0]);
  471.      return (TCL_ERROR);
  472.      };
  473.    set_socket(chip,Name,argv[1]);
  474.    Log(LOG_GENERAL,"# Set name of socket ident='%s' to be '%s'\n",argv[0],argv[1]);
  475.    return(TCL_OK);
  476.  
  477.  
  478. }
  479. /*********************** Set Port Command  ***************************/
  480. /* Forces the port to leave the partition */
  481. /*
  482. @title
  483. set PORt <net_name>
  484. @application vertical_hdl
  485. @text
  486. Forces port on the exterior of a partition if the net is used
  487. inside. This is used in VHDL partitioning.
  488. @break
  489. This is used when a net completes its connection from source
  490. to all destinations entirely within the partition. Set port
  491. ensures the net is observable via an output port on the
  492. exterior of the partition.
  493. @break
  494. For example: to observe an internal clock signal at the top
  495. level of the partition. Note this only works for nets which
  496. are visible at the top level of a created entity representing
  497. a partition of the design.
  498. @listing
  499. partition
  500. set port divided_clock
  501. @end
  502. */
  503. int SetPortHandler(ET_TCLARGS)
  504. {
  505.   int i;
  506.  
  507.   for(i=0;i<argc;i++){
  508.  
  509.       force_port(argv[i]);
  510.     }
  511.   return(TCL_OK);
  512.  
  513.   }
  514.  
  515. /*********************** Set Routable Command  ***************************/
  516. /* Sets nets to be routable  */
  517. /*
  518. @title
  519. set routable <net> <net> <net>
  520. @application vertical_pin
  521. @application vertical_pcb
  522. @text
  523. Sets the routable flags on wildcarded nets.
  524. VERTICAL will see these nets as routable and therefore
  525. use them for logic signal assignments.
  526. @end
  527. */
  528. int SetRouteHandler(ET_TCLARGS)
  529. {
  530.   int i;
  531.  
  532.   for(i=0;i<argc;i++){
  533.     force_route(argv[i],Free);
  534.     }
  535.   return(TCL_OK);
  536.   }
  537. /*********************** Set High Command  ***************************/
  538. /* Sets nets to be not routable  */
  539. /*
  540. @title
  541. set high <net> <net> <net>
  542. @application vertical_pin
  543. @application vertical_pcb
  544. @text
  545. Sets the routing flags on wildcarded nets as Not_Routable_H
  546. VERTICAL will see these nets as generally not routable for signals
  547. but pulled up to a logic '1'.
  548. @end
  549. */
  550. int SetHighHandler(ET_TCLARGS)
  551. {
  552.   int i;
  553.  
  554.   for(i=0;i<argc;i++){
  555.     force_route(argv[i],Not_Routable_H);
  556.     }
  557.   return(TCL_OK);
  558.   }
  559.  
  560. /*********************** Set Low Command  ***************************/
  561. /* Sets nets to be routable  */
  562. /*
  563. @title
  564. set low <net> <net> <net>
  565. @application vertical_pin
  566. @application vertical_pcb
  567. @text
  568. Sets the routing flags on wildcarded nets as Not_Routable_L
  569. VERTICAL will see these nets as generally not routable for signals
  570. but pulled up to a logic '0'.
  571. @end
  572. */
  573. int SetLowHandler(ET_TCLARGS)
  574. {
  575.   int i;
  576.  
  577.   for(i=0;i<argc;i++){
  578.     force_route(argv[i],Not_Routable_L);
  579.     }
  580.   return(TCL_OK);
  581.   }
  582.  
  583.  
  584. /*********************** Set Group ***************************/
  585. /* Sets FastTrack routing flags */
  586. /*
  587. @title
  588. set group <control> <socket> [ <socket> * ]
  589. @application vertical_hdl
  590. @text
  591. Control is an integer value. Socket is a wildcard
  592. @break
  593. Pin group control flags are setup for each socket:
  594. for each pin on that socket , while routing , if
  595. @listing
  596. <pin group pin A> & <control>  == <pin group pin B> & <control>
  597. @text
  598. Then the pins are seen to be interchangeable within their groups. This allows for the scrambling of
  599. a databus for e.g. a RAM chip where data in and out are shared. Some address pins could also be shared
  600. in this case.
  601. @break
  602. Quite often a pin would be given a pin group which is a power of 2:
  603. interchangeable address pins might be placed in group 1, interchangeable data pins in group 2.
  604.  
  605. @end
  606. */
  607. int SetGroupHandler(ET_TCLARGS) {
  608.  
  609.   int  i;
  610.   long num;
  611.   if (argc == 0)
  612.     return TCL_ERROR;
  613.   num = atoi(argv[0]); /* 16 bit number */
  614.   for (i=1;i<argc;i++ ){
  615.       set_group_route_flags(argv[i],(int)num);  
  616.     }
  617.   return TCL_OK;
  618.   }
  619.  
  620. /*********************** Set Group ***************************/
  621. /* Sets FastTrack pin group membership on device pins */
  622. /*
  623. @title
  624. set pin_group <control> <socket_id>[(<pin_id>)]
  625. @application vertical_pin
  626. @text
  627. Control is an integer value.
  628. @break
  629. Pin group memberships are setup for each pin on each socket. Socket identifier and pin identifiers can be wildcarded.
  630. The pin identifier is wrapped by "()" brackets.
  631. @listing
  632. set pin_group 11 X.*(.*a)
  633. @text
  634. All pins on sockets with identifiers beginning with 'X' and whose pin identifier ends
  635. in 'a' are to be made a member of group 11.
  636. @listing
  637. set pin_group 12 X12
  638. @text
  639. All pins on X12 are members of group 12; If the pin identifier is omitted this is the same as 'all pins on the socket'. Otherwise pins with Id matching will be processed.
  640.  
  641. @end
  642. */
  643.  
  644.  
  645.  
  646.  
  647. int SetPinGroupHandler(ET_TCLARGS) {
  648.  
  649.   int  i;
  650.   long num;
  651.   if (argc == 0)
  652.     return TCL_ERROR;
  653.   num = atoi(argv[0]); /* 16 bit number */
  654.   for (i=1;i<argc;i++ ){
  655.       set_pin_group_flags(argv[i],(int)num);  
  656.     }
  657.   return TCL_OK;
  658.   }
  659.  
  660. /*********************** Set External Command  ***************************/
  661. /* Sets sockets as external connections. Prevents 'rsvXXXXz' nets name
  662.    from appearing on connected nets */
  663. /*
  664. @title
  665. set EXTernal [<prefix> | <identifier> ]
  666. @application vertical_pin
  667. @application vertical_hdl
  668. @application vertical_pcb
  669. @text
  670. The concept of internal and external sockets is used in
  671. several situations. Imagine that an external socket is placed
  672. in a position where it is visible and the other non-external
  673. sockets are not visible.
  674. @break
  675. Once a socket has been declared as external,  different parts
  676. of VERTICAL use this information in different ways. If the
  677. user wishes to set different sockets as 'external'  at
  678. different times then this can be achieved by the use of set
  679. and del external commands.
  680. @break
  681. Wildcards using regexp pattern matching are allowed
  682. @break
  683. When routing, an internal socket will have pins that are
  684. connected to nets but not required on the socket named as
  685. 'rsvXXXXz'. An external socket will have these pins named
  686. according to the name of the net. (see route and preroute command)
  687. @break
  688. When creating jumpers, only those sockets marked as external
  689. will be considered for jumpering. (see jumper command)
  690. @break
  691. In addition, using the write external command will list only
  692. those sockets which have the external attribute.
  693. @listing
  694. set external X.*
  695. @text
  696. Will flag all sockets with identifier prefixed by 'X' as
  697. external.
  698. So in this case e.g. X1, X2, X100, X101_a will all be labelled
  699. as external.
  700. Usage of set external is cumulative.
  701. @break
  702. Only external sockets are listed out in write vlog command
  703. to filter out unwanted sockets by deleting the external
  704. property.
  705. @end
  706. */
  707. int SetExternHandler(ET_TCLARGS)
  708. {
  709.   int i;
  710.   for(i=0;i<argc;i++) {
  711.     set_external_flags(argv[i]);
  712.     }
  713.   return(TCL_OK);
  714.   }
  715.  
  716.  
  717.  
  718. /**************************************************************/
  719. /* wildcard setting of generics                               */
  720. /**************************************************************/
  721.  
  722. static void set_wildcard_generic( char * template,
  723.                                   generic_info_t * info)
  724.   {
  725.   int rc;
  726.   socket_t * skt = socket_head;
  727.   int found = 0;
  728.  
  729.   /* compile regular expression */
  730.   vert_regex_t * preg;
  731.  
  732. /* pick out a wildcard if all sockets then scope is the global generics */
  733.   if(ISNULLSTR(template))
  734.      {
  735.      set_generic_value(&global_generics,info);
  736.      return;
  737.      }
  738.  
  739.  
  740.  
  741.   rc = vert_regcomp(&preg,template);
  742.  
  743.   if (rc != 0 )
  744.     {
  745.     char errbuff[100];
  746.     regerror(rc,preg->preg,errbuff,100);
  747.     Log(LOG_ERROR,"-- Problem (rc=%d) %s with '%s' as regular expression\n",rc,errbuff,template);
  748.    
  749.     return /*TCL_ERROR*/;
  750.     }
  751.   else
  752.     {
  753.     Log(LOG_GENERAL,"-- Using '%s' as match pattern\n",template);
  754.     }
  755.  
  756.   while(skt) {
  757.     found  = regexec(preg->preg,skt->identifier,0,preg->regpatt,0);
  758.     if(!found) {
  759.       set_generic_value(&skt->generics,info);
  760.       }
  761.     skt = skt->next;
  762.     }
  763.  
  764.   vert_regfree(&preg);
  765.   }
  766.  
  767.  
  768. /*********************** Set FPGA Command  ***************************/
  769. /* Sets a socket as containing an FPGA : if set then a module declaration will not be made in
  770.    when writing VERILOG out  */
  771. /*
  772. @title
  773. set fpga <socket> <line_replacing_declaration>
  774. @application vertical_hdl
  775. @text
  776. Sets sockets as containing an FPGA : if set then a module declaration will not be made in
  777.    when writing VERILOG out
  778. @end
  779. */
  780. int SetFPGAHandler(ET_TCLARGS)
  781. {
  782.   generic_info_t info;
  783.   if(argc<2) {
  784.     Log(LOG_ERROR,"-- need 2 arguments to Set FPGA\n");
  785.     return TCL_ERROR;
  786.     }
  787.   info.name     = "fpga_file";
  788.   info.typename = "string";
  789.   info.g_type   = IS_ATTRIBUTE;
  790.   info.expr     = compile_expression_from_string(argv[1]);
  791.   info.g_class  = DEFINED;
  792.   set_wildcard_generic(argv[0],&info);
  793.   set_FPGA_flags(argv[0]); /* set flags */
  794.   return(TCL_OK);
  795.   }
  796.  
  797.  
  798. /*********************** Set Generic String ***************************/
  799. /* Sets a named generic to a value or string */
  800. /*
  801. @title
  802. set generic string <ident> <scope> <string>
  803. @application vertical_hdl
  804. @text
  805. This command sets up a generic identified by name as <ident>
  806. (variable) to be a string value.
  807. @break
  808. If <scope> is "" then the scope of the generic is global, applied to all sockets and signals within the design
  809. @listing
  810. set generic string vhdl_basetype "" "std_logic_vector"
  811. @text
  812. Will set up a global generic called vhdl_basetype with value "std_logic_vector"
  813. @break
  814. If <scope> is "*" then the generic is applied to all sockets. This is used to set a default value for all instances of that
  815. generic to the string value given. Its scope is local to each socket. It can be overridden by
  816. specific socket generic assignments.
  817. @break
  818. If <scope> is a wildcard (ends in "*")  then all of the sockets matching will have their generic values set.
  819. @end
  820. */
  821. int SetGenericStringHandler(ET_TCLARGS) {
  822.   generic_info_t info;
  823.   if (argc < 3)
  824.     return TCL_ERROR;
  825.   info.name = argv[1];
  826.   info.typename = "string";
  827.   info.g_type   = IS_STRING;
  828.   info.expr     = compile_string(argv[2]);
  829.   set_wildcard_generic(argv[0],&info);
  830.   return(TCL_OK);
  831.   }
  832. /*********************** Set Generic Declaration ***************************/
  833. /* Sets a named generic to a value or string */
  834. /*
  835. @title
  836. set generic declaration <ident> <scope> <string>
  837. @application vertical_hdl
  838. @text
  839. This sets up generics which are string generics but which are used in Verilog declarations
  840. for use with Certify. These are enclosed in verilog comments as pragmas when written out.
  841. @break
  842. See set generic string for more information.
  843. @end
  844. */
  845. int SetGenericDeclarationHandler(ET_TCLARGS) {
  846.   generic_info_t info;
  847.  
  848.   info.name = argv[1];
  849.   info.typename = "string";
  850.   info.g_class  = DEFINED;
  851.   info.g_type   = IS_DECLARATION_DIRECTIVE;
  852.   info.expr     = compile_string(argv[2]);
  853.   set_wildcard_generic(argv[0],&info);
  854.   return(TCL_OK);
  855.   }
  856. /*********************** Set Generic instance ***************************/
  857. /* Sets a named generic to a value or string */
  858. /*
  859. @title
  860. set generic instance <ident> <scope> <string>
  861. @application vertical_hdl
  862. @text
  863. This sets up generics which are string generics but which are used in Verilog instances
  864. for use with Certify. These are enclosed in verilog comments as pragmas when written out.
  865. @break
  866. See set generic string for more information.
  867. @end
  868. */
  869.  
  870. int SetGenericInstanceHandler(ET_TCLARGS) {
  871.   generic_info_t info;
  872.   if (argc < 3)
  873.     return TCL_ERROR;
  874.   info.name = argv[1];
  875.   info.typename = "string";
  876.   info.g_class  = DEFINED;
  877.   info.g_type   = IS_INSTANCE_DIRECTIVE;
  878.   info.expr     = compile_string(argv[2]);
  879.   set_wildcard_generic(argv[0],&info);
  880.  
  881.   return(TCL_OK);
  882.  
  883.   }
  884. /*********************** Set Generic Integer ***************************/
  885. /* Sets a named generic to an integer value*/
  886. /*
  887. @title
  888. set generic integer <ident> <scope> <expression>
  889. @application vertical_hdl
  890. @text
  891. This sets up generics which are integer expressions, usable in place of VHDL constant declarations in .acfp files.
  892. @break
  893. See set generic string for more information.
  894. @end
  895. */
  896.  
  897.  
  898. int SetGenericIntegerHandler(ET_TCLARGS) {
  899.   generic_info_t info;
  900.   if (argc < 3)
  901.     return TCL_ERROR;
  902.   info.name = argv[1];
  903.   info.typename = "integer";
  904.   info.g_type   = IS_INTEGER;
  905.   info.g_class  = DEFINED;
  906.   info.expr     = compile_expression_from_string(argv[2]); /* this needs to be altered */
  907.  
  908.  
  909.   set_wildcard_generic(argv[0],&info);
  910.   return(TCL_OK);
  911.  
  912.  
  913.  
  914.  
  915.   }
  916.  
  917.  
  918. /*********************** Set Generic Value ***************************/
  919. /* Sets a named generic to an integer range : workout from range whether this is TO or DOWNTO  */
  920. /*
  921. @title
  922. set generic value <ident> <scope> <expression>
  923. @application vertical_hdl
  924. @text
  925. Sets a named generic to an integer range : workout from range whether this is TO or DOWNTO, (TO has first expression less than second), usable in place of VHDL constant declarations in .acfp files.
  926. @break
  927. See set generic string for more information.
  928. @end
  929. */
  930.  
  931. int SetGenericValueHandler(ET_TCLARGS) {
  932.  
  933.  expression_t * p;
  934.   generic_info_t info ;
  935.   if (argc<3)
  936.     return (TCL_ERROR);
  937.  
  938.   info.name = argv[1];
  939.  
  940.  
  941.   p   = compile_expression_from_string(argv[2]);
  942.  
  943.   if(p)
  944.     {
  945.     switch(p->opcode)
  946.       {
  947.       case TO:
  948.       case DOWNTO:
  949.         {
  950.         info.g_type = p->opcode;
  951.         info.typename = "integer range";
  952.         break;
  953.         }
  954.       case TXT_STRING:
  955.         {
  956.         info.g_type   = IS_STRING;
  957.         info.typename = "string";
  958.         break;
  959.         }
  960.       default:
  961.         {
  962.         info.g_type   = IS_INTEGER;
  963.         info.typename = "integer";
  964.         break;
  965.         }
  966.       }
  967.     }  
  968.      
  969.   info.g_class  = DEFINED;
  970.   info.expr    = p;
  971.        
  972.   set_wildcard_generic(argv[0],&info);
  973.   return(TCL_OK);
  974.   }
  975.  
  976.  
  977. /*********************** Set Generic Attribute ***************************/
  978. /* Sets a named generic attribute to an integer value*/
  979. /*
  980. @title
  981. set generic attribute <ident> <scope> <expression>
  982. @application vertical_hdl
  983. @text
  984. This sets up generics which are integer expressions, usable in place of VHDL constant declarations in .acfp files.
  985. @break
  986. See set generic string for more information.
  987. @end
  988. */
  989.  
  990.  
  991. int SetGenericAttributeHandler(ET_TCLARGS) {
  992.   generic_info_t info;
  993.   if (argc < 3)
  994.     return TCL_ERROR;
  995.   info.name = argv[1];
  996.   info.typename = "attribute";
  997.   info.g_type   = IS_ATTRIBUTE;
  998.   info.expr     = compile_expression_from_string(argv[2]);
  999.   info.g_class  = DEFINED;
  1000.   set_wildcard_generic(argv[0],&info);
  1001.   return(TCL_OK);
  1002.   }
  1003.  
  1004. /*********************** Set Generic Boolean ***************************/
  1005. /* Sets a named generic to an integer value*/
  1006. /*
  1007. @title
  1008. set generic boolean <ident> <scope> <integer>
  1009. @application vertical_hdl
  1010. @text
  1011. This sets up booleans containing the value of boolean expressions, usable in place of VHDL constant declarations in .acfp files.
  1012. @break
  1013. Any non-zero integer is TRUE, and zero is FALSE.
  1014. @break
  1015. See set generic string for more information.
  1016. @end
  1017. */
  1018.  
  1019.  
  1020. int SetGenericBooleanHandler(ET_TCLARGS) {
  1021.   generic_info_t info;
  1022.   if (argc < 3)
  1023.     return TCL_ERROR;
  1024.   info.name = argv[1];
  1025.   info.typename = "integer";
  1026.   info.g_type   = IS_BOOLEAN;
  1027. /* think about using : convert_num(char * string,int * value) */
  1028.   info.expr     = compile_expression_from_string(argv[2]); /* Can use true/false as well now ... */
  1029.   set_wildcard_generic(argv[0],&info);
  1030.   return(TCL_OK);
  1031.   }
  1032.  
  1033.  
  1034.  
  1035.  
  1036. /*********************** Set Generic Menu ***************************/
  1037. /* Sets a named generic to a value or string */
  1038.  
  1039.   CommandMenu SetGenericMenu= {
  1040.     {"attribute", 3, SetGenericAttributeHandler,NULL,
  1041.                      "Integer instance attribute",
  1042.                      "<socket*>|\"\" <name> <value>",NULL},
  1043.     {"string",    3, SetGenericStringHandler,NULL,
  1044.                      "String constant",
  1045.                      "<socket*>|\"\" <name> <string text>",NULL},
  1046.     {"integer",    3, SetGenericIntegerHandler,NULL,
  1047.                      "Integer constant expression",
  1048.                      "<socket*>|\"\" <name> <value>",NULL},
  1049.     {"boolean",    3, SetGenericBooleanHandler,NULL,
  1050.                      "Boolean constant",
  1051.                      "<socket*>|\"\" <name> <value>",NULL},
  1052.      {"value",     3, SetGenericValueHandler,NULL,
  1053.                      "Generic expression",
  1054.                      "<socket*>|\"\" <name> <expression>",NULL},
  1055.     {"declaration", 3, SetGenericDeclarationHandler,NULL,
  1056.                      "Certify .vb declaration directive",
  1057.                      "<socket*>|\"\" <name> <value>",NULL},
  1058.     {"instance",     3, SetGenericInstanceHandler,NULL,
  1059.                      "Certify .vb instance directive",
  1060.                      "<socket*>|\"\" <name> <value>",NULL},
  1061.     { NULL,0,NULL,NULL,NULL}
  1062.  
  1063.  
  1064.  };
  1065.  
  1066. /*********************** Set Command  ***************************/
  1067.  
  1068.   CommandMenu SetMenu = {
  1069.     {"id_of_name",    2, SetIdOfNameHandler,NULL,
  1070.                      "Set Identifier for Name",
  1071.                      "<device_name> <new_id>",NULL},
  1072.     {"name_id",    2, SetNameOfIdHandler,NULL,
  1073.                      "Sets name for socket identifier",
  1074.                      "<device_id> <new_name>",NULL},
  1075.     {"type_id",     6, SetTypeOfIDHandler,NULL,
  1076.                      "Sets type for socket identifier",
  1077.                      "<device_id> <new_type>",NULL},
  1078.     {"type_name",     2, SetTypeOfNameHandler,NULL,
  1079.                      "Sets type for device named",
  1080.                      "<device_name> <new_type>",NULL},
  1081.     {"partition",    3, SetPartHandler,NULL,
  1082.                      "Sets partition list",
  1083.                      "<socket_name>*",NULL},
  1084.     {"all_partition",5, SetPartAllHandler,NULL,
  1085.                      "Sets partition list to all sockets",
  1086.                      "",NULL},
  1087.     {"port",         3, SetPortHandler,NULL,
  1088.                      "Forces port on partition if used inside",
  1089.                      "<net_name_prefix>*",NULL},
  1090.     {"routable", 3,  SetRouteHandler,NULL,
  1091.                      "Flags routed nets as routable",
  1092.                      "<net_id>*",NULL},
  1093.     {"high", 3,      SetHighHandler,NULL,
  1094.                      "Flags routed nets as not routable logic 1",
  1095.                      "<net_id>*",NULL},
  1096.     {"low", 3,       SetLowHandler,NULL,
  1097.                      "Flags routed nets as not routable logic 0",
  1098.                      "<net_id>*",NULL},
  1099.     {"external",     3, SetExternHandler,NULL,
  1100.                      "Sets socket IDs prefixed by prefix as external",
  1101.                      "<prefix>*",NULL},
  1102.     {"fpga",        3, SetFPGAHandler,NULL,
  1103.                      "Sets socket IDs prefixed by prefix as being FPGA: no Verilog declaration",
  1104.                      "<prefix>*",NULL},
  1105.     {"group",     3, SetGroupHandler,NULL,
  1106.                      "Enables 'FastTrack group' routing: 1=row 2=col 3=both",
  1107.                      "<mask_value> [<id_prefix>*]",NULL},
  1108.     {"pin_group",     3, SetPinGroupHandler,NULL,
  1109.                      "Sets pin group membership on pins of devices",
  1110.                      "<group> <id_prefix>[(<pin_prefix>)]",NULL},
  1111.     {"generic",  3, NULL,SetGenericMenu,
  1112.                      "Sets generic value  ",
  1113.                      "more",NULL},
  1114.     { NULL,0,NULL,NULL,NULL,NULL},
  1115.  
  1116.     };
  1117.  
  1118.  
  1119. /*********************** Delete Port Command  ***************************/
  1120. /* Deletes the ports from the partition */
  1121. /*
  1122. @title
  1123. delete port <port> [ <port> ]*
  1124. @application vertical_hdl
  1125. @text
  1126. Remove port from partition. If a signal (port) of that name
  1127. exists on the top level of a partition, it is made to be
  1128. hidden inside.
  1129. @break
  1130. This is used e.g. when a local copy of a bus is used in all
  1131. partitions on a multiple EPLD board.
  1132. If the bus appears as a port on all of  the EPLDs as it would
  1133. by default, as there is a driver inside each EPLD and inputs
  1134. in each EPLD, then there will be multiple driver conflicts on
  1135. the breadboard.
  1136. @end
  1137. */
  1138. int DelPortHandler(ET_TCLARGS)
  1139. {
  1140.   int i;
  1141.   for(i=0;i<argc;i++) {
  1142.     delete_port(argv[i]);
  1143.   }
  1144.   return(TCL_OK);
  1145. }
  1146.  
  1147.  
  1148. /*********************** Set Not Routable Command  ***************************/
  1149. /* Sets nets to be not routable  */
  1150. /*
  1151. @title
  1152. delete route <net> [ <net> ] *
  1153. @application vertical_pin
  1154. @application vertical_hdl
  1155. @application vertical_pcb
  1156. @text
  1157. Remove the routable property from the named nets. These nets will not be used in routing by vertical.
  1158. @listing
  1159. del route VCC.* GND.* NCONFIG CONF_DONE
  1160. @text
  1161. Will ensure that these nets are set as not routable.
  1162. This is often seen in netlist import scripts.
  1163. @end
  1164. */
  1165. int DelRouteHandler(ET_TCLARGS)
  1166. {
  1167.   int i;
  1168.   for(i=0;i<argc;i++) {
  1169.     force_route(argv[i],Not_Routable);
  1170.     }
  1171.   return(TCL_OK);
  1172. }
  1173.  
  1174.  
  1175.  
  1176. /*********************** Delete NetName Command  ***************************/
  1177. /* Deletes the name fileds form nets by ID  from the partition */
  1178. /*
  1179. @title
  1180. delete netname <net> [ <net> ] *
  1181. @application vertical_pin
  1182. @application vertical_hdl
  1183. @application vertical_pcb
  1184. @text
  1185. The signal names assigned to the nets are removed, so that clean netlists are
  1186. written out without any routing history. Use this if when importing netlists,
  1187. where the net names used may match those in the as yet unrouted design that
  1188. will use those nets. Routing that tries to reuse nets which were previously
  1189. used will be confused by names appearing on the nets.
  1190. @end
  1191. */
  1192.  
  1193. int DelNetNameHandler(ET_TCLARGS)
  1194. {
  1195.   int i;
  1196.   for(i=0;i<argc;i++) {
  1197.     del_net_names(argv[i]);
  1198.     }
  1199.   return(TCL_OK);
  1200. }
  1201. /*********************** Delete Port Command  ***************************/
  1202. /* Clears the is_external bits on all sockets */
  1203. /*
  1204. @title
  1205. delete EXTernal <socket> [ <socket ] *
  1206. @application vertical_pin
  1207. @application vertical_hdl
  1208. @application vertical_pcb
  1209. @text
  1210. This clears the external attribute flags from all sockets. The
  1211. name matching rules are the same as for set external command
  1212. @end
  1213. */
  1214. int DelExternHandler(ET_TCLARGS)
  1215. {
  1216.   int i;
  1217.   for(i=0;i<argc;i++) {
  1218.     clear_external_flags(argv[i]);
  1219.     }
  1220.   return(TCL_OK);
  1221.   }
  1222.  
  1223. /*********************** Delete Port Command  ***************************/
  1224. /* Clears the is_FPGA bits on all sockets */
  1225. /*
  1226. @title
  1227. delete FPGA <socket> [ <socket ] *
  1228. @application vertical_hdl
  1229. @text
  1230. This clears the FPGA attribute flags from all sockets. The
  1231. name matching rules are the same as for set FPGA command
  1232. @end
  1233. */
  1234. int DelFPGAHandler(ET_TCLARGS)
  1235. {
  1236.   int i;
  1237.   for(i=0;i<argc;i++) {
  1238.     clear_FPGA_flags(argv[i]);
  1239.     }
  1240.   return(TCL_OK);
  1241.   }
  1242.  
  1243. /*********************** Delete Partition Command  ***************************/
  1244. /* Clears the partition selection on all sockets */
  1245. /*
  1246. @title
  1247. delete partition <socket> [ <socket>* ]
  1248. @application vertical_hdl
  1249. @text
  1250. This clears the partition flags from wildcarded named sockets. The
  1251. name matching rules are the same as for set partition command
  1252. @break
  1253. If no arguments are given this results in routing created for the partition being
  1254. ripped up. Use
  1255. @listing
  1256. delete partition
  1257. @text
  1258. to clean up
  1259. @end
  1260. */
  1261. int DelPartitionHandler(ET_TCLARGS)
  1262.   {
  1263.   int i,Status = TCL_OK;
  1264.   if (argc==0)
  1265.     {
  1266.     clear_partition_nets();
  1267.     Status = set_clear_partition(".*",0);
  1268.     }
  1269.  
  1270.   for(i=0;i<argc && Status == TCL_OK;i++){
  1271.     Status = set_clear_partition(argv[i],0);
  1272.     }
  1273.   if(Status != TCL_OK)
  1274.     {
  1275.     Log(LOG_ERROR,"-- ERROR with pattern '%s'\n",argv[i]);
  1276.     }
  1277.   return(Status);
  1278.   }
  1279.  
  1280.  
  1281. /*********************** Delete Generic Command  ***************************/
  1282. /*
  1283. @title
  1284. delete generic <generic_name> <scope>
  1285. @application vertical_hdl
  1286. @text
  1287. This function will delete any generic given in either global generics or all sockets matching pattern.
  1288. See set generic for naming rules.
  1289. @end
  1290. */
  1291. int DelGenericHandler(ET_TCLARGS)
  1292.   {
  1293.   generic_info_t info ;
  1294.   int rc;
  1295.   socket_t * skt = socket_head;
  1296.   int found = 0;
  1297.   /* compile regular expression */
  1298.   vert_regex_t * preg;
  1299.  
  1300.   if (argc<2)
  1301.     return (TCL_ERROR);
  1302.  
  1303.  
  1304.   info.name = argv[1];
  1305.  
  1306. /* pick out a wildcard if all sockets then scope is the global generics */
  1307.   if(ISNULLSTR(argv[0]))
  1308.      {
  1309.      del_generic_value(&global_generics,&info);
  1310.      return 0;
  1311.      }
  1312.  
  1313.  
  1314.  
  1315.   rc = vert_regcomp(&preg,argv[0]);
  1316.  
  1317.   if (rc != 0 )
  1318.     {
  1319.     char errbuff[100];
  1320.     regerror(rc,preg->preg,errbuff,100);
  1321.     Log(LOG_ERROR,"-- Problem (rc=%d) %s with '%s' as regular expression\n",rc,errbuff,argv[0]);
  1322.    
  1323.     return TCL_ERROR;
  1324.     }
  1325.   else
  1326.     {
  1327.     Log(LOG_GENERAL,"-- Using '%s' as match pattern\n",argv[0]);
  1328.     }
  1329.  
  1330.  
  1331.  
  1332.  
  1333.   while(skt) {
  1334.     found  = regexec(preg->preg,skt->identifier,0,preg->regpatt,0);
  1335.     if(!found) {
  1336.       del_generic_value(&skt->generics,&info);
  1337.       }
  1338.     skt = skt->next;
  1339.     }
  1340.   vert_regfree(&preg);
  1341.   return 0;
  1342.   }
  1343.  
  1344.  
  1345.  
  1346. /*********************** Delete Command  ***************************/
  1347.  
  1348.  
  1349.  
  1350.   CommandMenu DeleteMenu= {
  1351.     {"port",    2, DelPortHandler,NULL,
  1352.                      "Remove port from partition",
  1353.                      "<net_name_prefix>* ",NULL},
  1354.     {"routable", 3,  DelRouteHandler,NULL,
  1355.                      "Flags routed nets as NOT_ROUTABLE",
  1356.                      "<net_id>*",NULL},
  1357.     {"netname",    3, DelNetNameHandler,NULL,
  1358.                      "Remove name from nets by ID",
  1359.                      "<net_ID>*",NULL},
  1360.     {"external",    3, DelExternHandler,NULL,
  1361.                      "Set sockets as being internal",
  1362.                      "<name_prefix>*",NULL},
  1363.     {"fpga",        3, DelFPGAHandler,NULL,
  1364.                      "Set sockets as not being FPGA: Verilog declaration given",
  1365.                      "<name_prefix>*",NULL},
  1366.     {"generic",     3, DelGenericHandler,NULL,
  1367.                      "Removes generic values from sockets",
  1368.                      "<socket>* <generic_name>",NULL},
  1369.     {"partition",   3, DelPartitionHandler,NULL,
  1370.                      "Clear the partition list",
  1371.                      "",NULL},
  1372.     { NULL,0,NULL,NULL,NULL}
  1373.  
  1374.     };
  1375.  
  1376.  
  1377. /*********************** Partial routing calls ***************************/
  1378.  
  1379. /*********************** Route By Path ***************************/
  1380. /*
  1381. @title
  1382. preroute path
  1383. @application vertical_pin
  1384. @application vertical_pcb
  1385. @text
  1386. Route by path only: If there exists a routed path between the
  1387. chips which has the correct pin directions on each chip
  1388. visited, then this path will be used to carry the unrouted
  1389. net.
  1390. @end
  1391. */
  1392.  
  1393. int RoutePathHandler (ET_TCLARGS)
  1394.    {
  1395.    Log (LOG_GENERAL, "#begin routing\n");
  1396.    perform_routing(By_Net);
  1397.    Log (LOG_GENERAL, "#done routing\n");
  1398.    return (TCL_OK);
  1399.    }
  1400. /*********************** Route By Exact Path ***************************/
  1401. /*
  1402. @title
  1403. preroute EXact
  1404. @application vertical_pin
  1405. @application vertical_pcb
  1406. @text
  1407. Route by exact same path only: As for preroute path, but the
  1408. unrouted net and the routed net must both visit the same pins
  1409. on the chips that are visited by the nets. This is important
  1410. where there are very specific pin functions associated with a
  1411. pin.
  1412. @break
  1413. It also helps with maintenace of similar routing if a design
  1414. is recompiled via maxplus2, the newly unrouted  nets will tend
  1415. to be routed on the same routed nets as for the first compile
  1416. if this is used.
  1417. @end
  1418. */
  1419.  
  1420. int RouteExactPathHandler (ET_TCLARGS)
  1421.    {
  1422.    Log (LOG_GENERAL, "#begin routing\n");
  1423.    perform_routing(By_Exact_Net);
  1424.    Log (LOG_GENERAL, "#done routing\n");
  1425.    return (TCL_OK);
  1426.    }
  1427. /*********************** Route By Fixed Net ***************************/
  1428. /*
  1429. @title
  1430. preroute FIxed
  1431. @application vertical_pin
  1432. @application vertical_pcb
  1433. @text
  1434. Route by fixed nets only. Any nets which have a fixed pin on
  1435. them will be routed first. Fixed pins are those where the pin
  1436. identifier used on a socket in the unrouted list should carry
  1437. the same signal after routing. This is used to keep e.g.
  1438. external connections.
  1439. @end
  1440. */
  1441. int RouteFixedNetHandler (ET_TCLARGS)
  1442.    {
  1443.    Log (LOG_GENERAL, "#begin routing\n");
  1444.    perform_routing(By_Fixed_Net);
  1445.    Log (LOG_GENERAL, "#done routing\n");
  1446.    return (TCL_OK);
  1447.    }
  1448.  
  1449. /*********************** Route By Name ***************************/
  1450. /*
  1451. @title
  1452. preroute NAMe
  1453. @application vertical_pin
  1454. @application vertical_pcb
  1455. @text
  1456. Route by name only: If the net identifier of an unrouted net
  1457. matches either the net name or identifier of a routed net then
  1458. the router will try and use this net. All pins must be in the
  1459. right direction and of the right type for a route to succeed.
  1460. @break
  1461. Once an unrouted net has been routed, the name of a routed net
  1462. will be changed to the identifier of the unrouted net. This
  1463. again encourages successive re-routings of a design to use the
  1464. same nets wherever possible.
  1465. @end
  1466. */
  1467. int RouteNameHandler (ET_TCLARGS)
  1468.    {
  1469.    Log (LOG_GENERAL, "#begin routing\n");
  1470.    perform_routing(By_Name);
  1471.    Log (LOG_GENERAL, "#done routing\n");
  1472.    return (TCL_OK);
  1473.    }
  1474.  
  1475. /*********************** Route By creating Nets ***************************/
  1476. /*
  1477. @title
  1478. preroute CREate
  1479. @application vertical_pin
  1480. @application vertical_hdl
  1481. @application vertical_pcb
  1482. @text
  1483. Route by creating nets only: The user will be asked to join
  1484. the pins of the devices in question with wires. This is
  1485. intended for use with uncomitted wirewrap boards. Once a board
  1486. has been part-wired, or if it is a PCB,  then the use of the
  1487. jumpering commands permits the generation of new wiring lists.
  1488. @break
  1489. If nets are created during routing of a PCB there is a
  1490. problem. This is why this subcommand is not performed by default
  1491. with the route command.
  1492.  
  1493. @end
  1494. */
  1495. int RouteCreateHandler (ET_TCLARGS)
  1496.    {
  1497.    Log (LOG_GENERAL, "#begin routing\n");
  1498.    perform_routing(By_Creating);
  1499.    Log (LOG_GENERAL, "#done routing\n");
  1500.    return (TCL_OK);
  1501.    }
  1502.  
  1503.  
  1504.  
  1505.   CommandMenu PrerouteMenu = {
  1506.     {"path",    2, RoutePathHandler,NULL,
  1507.                      "Route by path only",
  1508.                      "",NULL},
  1509.     {"fixed",    2, RouteFixedNetHandler,NULL,
  1510.                      "Route by fixed nets only",
  1511.                      "",NULL},
  1512.     {"exact",    2, RouteExactPathHandler,NULL,
  1513.                      "Route by exact same path only",
  1514.                      "",NULL},
  1515.     {"name",    3, RouteNameHandler,NULL,
  1516.                      "Route by name only",
  1517.                      "",NULL},
  1518.     {"create",    3, RouteCreateHandler,NULL,
  1519.                      "Route by creating nets only",
  1520.                      "",NULL},
  1521.         { NULL,0,NULL,NULL,NULL},
  1522.  
  1523.     };
  1524.  
  1525. /*********************** Simple command calls ***************************/
  1526. /*
  1527. @title
  1528. route
  1529. @application vertical_pin
  1530. @application vertical_hdl
  1531. @application vertical_pcb
  1532. @text
  1533. Route the wiring.
  1534. Any nets with their routing status set as NOT_ROUTABLE will
  1535. not be considered for routing. Use to protect VDD, GND from
  1536. being used for general signal routing.
  1537. @break
  1538. An experiment in version 16.5 onwards allows for NOT_ROUTABLE_H
  1539. and NOT_ROUTABLE_L tracks that can be used as pullup and
  1540. pulldown, as they represent logic '1' and logic '0' values.
  1541. @break
  1542. The list of metal tracks on the PCB, the  wired nets is
  1543. reconciled with the list of desired connections, the unrouted
  1544. nets and the assignment of the unrouted nets to the wired nets
  1545. produces the routed nets list.
  1546. @break
  1547. As  there are several phases to the routing, and the order  in
  1548. which  they are applied is fixed, it has been found  necessary
  1549. to  occasionally use the preroute command to order the use  of
  1550. the routing algorithms.
  1551. @break
  1552. The  order of use of routing algorithms implied by using route
  1553. is as follows:
  1554. @listing
  1555. preroute name, preroute fixed , preroute exact, preroute path
  1556. @text
  1557. This is then automatically followed by the
  1558. @listing
  1559. reserve
  1560. @text
  1561. command, which ensures pin reservation for Maxplus2. If you need to use 'preroute' then
  1562. you will need to use the 'reserve' command, to ensure pin reservation.
  1563. @break
  1564. The 'preroute create' option is now only available via preroute. Nobody
  1565. needs a PCB to silently grow extra tracks. If the goal is to
  1566. create a new PCB or wirewrap list then this option will be
  1567. necessary.
  1568. @break
  1569. To achieve the same effect as the older 'route' command, use
  1570. 'route' then 'preroute create'.
  1571. @break
  1572. Just prior to issuing any route commands, any new pins added
  1573. to the design will be checked for pin renaming and the
  1574. unrouted netlist is updated.
  1575. @end
  1576. */
  1577. int ROUTEHandler (ET_TCLARGS)
  1578.    {
  1579.    Log (LOG_GENERAL, "#begin routing\n");
  1580.    perform_routing(Free);
  1581.    Log (LOG_GENERAL, "#done routing\n");
  1582.    return (TCL_OK);
  1583.    }
  1584.  
  1585. /**************************************************************************/
  1586. /*
  1587. @title
  1588. reserve
  1589. @application vertical_pin
  1590. @text
  1591. Perform pin reservation according to Maxplus2 requirements.
  1592. @break
  1593. This function ensures net reservation is made for all internal
  1594.    nodes that are on internal sockets .
  1595. @break
  1596.    If any external socket is on the net then all internal pins are reserved.
  1597.    Otherwise a single internal pin is left as a non-reserved driver
  1598. @end
  1599. */
  1600.  
  1601. int ReservePinsHandler (ET_TCLARGS)
  1602.    {
  1603.    Log (LOG_GENERAL, "#begin pin reservation\n");
  1604.    ensure_reservation();
  1605.    Log (LOG_GENERAL, "#done pin reservation\n");
  1606.    return (TCL_OK);
  1607.    }
  1608.  
  1609.  
  1610.  
  1611.  
  1612.  
  1613. /*********************** Simple command calls ***************************/
  1614. /* partitioning */
  1615. /*
  1616. @title
  1617. partition
  1618. @application vertical_hdl
  1619. @text
  1620. Do the partition calculation. This takes the entities given in
  1621. the partition and works out the port list for the top level.
  1622. @break
  1623. To do this the partitioner must be made aware of the entire set
  1624. of top level entity port lists in the system.
  1625. @break
  1626. To do this an acfp, vhdl or verilog file must be read in
  1627. containing a description of the top level entity for each
  1628. block used in the partition.
  1629. @break
  1630. See the section on Vertical script files.
  1631. @end
  1632. */
  1633.  
  1634. int PARTHandler( ET_TCLARGS)
  1635.    {
  1636.    Log (LOG_GENERAL, "#begin partition\n");
  1637.    create_unrouted_list();
  1638.    clear_partition_generics(&partition_generics);
  1639.    perform_partition();
  1640.    Log (LOG_GENERAL, "#done partition\n");
  1641.    return (TCL_OK);
  1642.    }
  1643.  
  1644.  
  1645.  
  1646.  
  1647. /*********************** Simple command calls ***************************/
  1648. /* trial */
  1649. /*
  1650. @title
  1651. fix_pins
  1652. @application vertical_pin
  1653. @application vertical_pcb
  1654. @text
  1655. This command is used in conjunction with set external on a socket. If a socket is set external and it has unrouted nets connected to it, the fix_pins command
  1656. will attempt to freeze the connections given in the unrouted netlist. This means that a socket with a defined pinout should be routed with that pinout rather than
  1657. having the pinout exchanged by VERTICAL.
  1658. @break
  1659. NB If an attempt is made to connect a signal to a net which cannot reach its destination because
  1660. there is no wire present, then the signal will be moved to another pin which reaches the destination.
  1661.  
  1662. @end
  1663. */
  1664.  
  1665. int FIXHandler (ET_TCLARGS)
  1666.    {
  1667.    Log (LOG_GENERAL, "#begin attempting to fix port pins\n");
  1668.    perform_trial_naming();
  1669.    Log (LOG_GENERAL, "#done fixing pins\n");
  1670.    return (TCL_OK);
  1671.    }
  1672. /*********************** Simple command calls ***************************/
  1673. /* Auto-jumpering
  1674. @title
  1675. jumper <suffix>
  1676. @application vertical_pin
  1677. @application vertical_pcb
  1678. @text
  1679. This is the original routing algorithm for VERTICAL.
  1680. This can be used to create wirewrap jumper lists.
  1681. If there are unrouted connections made between sockets that are flagged as external, and which therefore
  1682. need wirewrapped connections.
  1683. @break
  1684. In use different pairs or groups of sockets would be set as external and then the jumper command is issued for that pair or group.
  1685. The suffix would be used to identify the jumpers created from each induvidual jumper command: These can then be extracted for wirewrap lists.
  1686. @end
  1687. */
  1688.  
  1689. int JUMPERHandler (ET_TCLARGS)
  1690.   {
  1691.   char * Suffix;
  1692.   if (argc<1 )
  1693.      Suffix = NULL;
  1694.    else
  1695.      Suffix = argv[0];
  1696.    Log (LOG_GENERAL, "#begin jumpering\n");
  1697.    create_unrouted_list();
  1698.    perform_jumpering(Suffix);
  1699.    Log (LOG_GENERAL, "#done jumpering\n");
  1700.    return (TCL_OK);
  1701.    }
  1702.  
  1703.  
  1704. /******************** Parser for the 'DO' batch files ***********************/
  1705. /*
  1706. @title
  1707. do <commandfile> [ <arg1> <arg2> ... ]
  1708. @application vertical_pin
  1709. @application vertical_hdl
  1710. @application vertical_pcb
  1711. @text
  1712. Interpret the command file as though typed in on the command line.
  1713. @break
  1714. The argument list are accessible as $1, $2 etc while interpreting the command file, and can be used to pass down
  1715. arguments to the file.
  1716. @break
  1717. Up to 10 levels of nesting of command files is allowed. This limit is imposed to trap recursion.
  1718. @end
  1719.  
  1720. */
  1721. int DOHandler (ET_TCLARGS)
  1722.    {
  1723.    FILE *DoFile;
  1724.    if (argc<1)
  1725.      return(TCL_ERROR);
  1726.  
  1727.  
  1728.    DoFile = trap_fopen(argv[0], "r");             /* open text file for reading */
  1729.    if (!DoFile)  {
  1730.       Log (LOG_ERROR, "# Error opening file: <%s>\n", argv[0]);
  1731.       return(TCL_ERROR);
  1732.       }
  1733.    else  {
  1734.       ParseFile (DoFile,argc-1,argv+1);
  1735.       fclose (DoFile);
  1736.       InitialiseData(); /* March 8 2000 :
  1737.                          * added to make sure any environment
  1738.                          *  variables which are directly used as
  1739.                          *  C structures are set. */
  1740.       return (TCL_OK);
  1741.       }
  1742.    }
  1743. /******************** Calling the count nets with few nodes ***********************/
  1744. /*
  1745. @title
  1746. count_nets [ <threshold> ]
  1747. @application vertical_pin
  1748. @application vertical_hdl
  1749. @application vertical_pcb
  1750. @text
  1751. Report on nets with a node count less than or equal to threshold. Used to find
  1752. hanging unrouted nets where there is an error in the netname.
  1753. @break
  1754. If no threshold is given , the threshold defaults to 1
  1755. @end
  1756. */
  1757.  
  1758.  
  1759.  
  1760.  
  1761. int COUNTNETSHandler (ET_TCLARGS) {
  1762.  
  1763.  
  1764.    long limit;
  1765.    if (argc<1)
  1766.      limit = 1;
  1767.    else
  1768.      limit = atoi(argv[0]);
  1769.    count_nets_with_few_nodes((int) limit);
  1770.  
  1771.    return (TCL_OK);
  1772.    }
  1773.  
  1774. /*********************** Ensure Templates Command  ***************************/
  1775. /* this ensures all templated sockets have all correct pin properties */
  1776.  
  1777. /*
  1778. @title
  1779. Socket Templating Background Information
  1780. @application vertical_pin
  1781. @application vertical_hdl
  1782. @application vertical_pcb
  1783. @text
  1784. When the maxplus2 software runs and it fits a design to  an
  1785. EPLD, it only lists out the pins that it has in fact  used.
  1786. All unused pins on a chip will remain unknown to VERTICAL. The
  1787. use of templates is meant to overcome this. If a template is
  1788. read in for a particular device type , the VERTICAL tool  can
  1789. ensure that every instance of that device in the design will
  1790. have all of its pins available. An aliasing mechanism exists
  1791. for allowing a group of device types (e.g. speed variants) to
  1792. all share the same template.
  1793. @break
  1794. In addition in Vertical-HDL, the socket templates are used as being logically equivalent to a VHDL component declaration.
  1795. The elaborate command ensures that the socket templates( declarations of ports and generics) are applied to the component instances.
  1796. @break
  1797.  
  1798. There are two template commands. When these are issued, all
  1799. sockets are checked to see if there is a template for them.
  1800. For any socket with a template, if the socket lacks a pin
  1801. identifier defined in the template, it is given an unassigned
  1802. pin with that identifier and appropriate pin type.
  1803. All definition of socket templating is achieved by the use of
  1804. ACFP files. A socket type template has the same general syntax
  1805. as the CHIP template. Pins are listed out with no name but
  1806. with an identifier (pin number) and a direction. There is also
  1807. the possiblility of aliasing chip types - e.g. all speed
  1808. variants of the FLEX10k50GC403 have the same pinout. Only one
  1809. template need be defined, the others can all be derived simply
  1810. from it by using template aliasing in the acfp file.
  1811. So you would find e.g.
  1812. @listing
  1813. TEMPLATE FLEX10K50GC403;
  1814. BEGIN
  1815.       "" : INPUT_PIN = AL1 ;
  1816. .     "" : CONFIG_PIN = AL2;
  1817. ... more stuff ....
  1818. END;
  1819. @text
  1820. Then, assuming you have
  1821. @listing
  1822. TEMPLATE EPM10K50GC403-3;
  1823. BEGIN
  1824.       ALIAS FLEX10K50GC403;
  1825. END;
  1826. @text
  1827. Then if a chip of type EPM10K50GC403-3 is seen then the pinout
  1828. template that will be used will be the FLEX10K50GC403 version.
  1829.  
  1830. @end
  1831.  
  1832. @title
  1833. Templating Equivalent Pins: Series resistor handling
  1834. @application vertical_pin
  1835. @application vertical_hdl
  1836. @application vertical_pcb
  1837. @text
  1838. In order to deal with problems associated with series
  1839. termination resistors in signal lines on high performance
  1840. FPGAs, where the resistors are seen as disconnections of nets,
  1841. the concept of equivalent pins has been developed.
  1842. @break
  1843. If a device has equivalent pins then any signal seen on one
  1844. equivalent pin can be regarded as also appearing on any other
  1845. of the equivalent pins. As of Sep 2000 the pin directions of
  1846. the device are ignored. If a device has equivalent pins then
  1847. these can be automatically connected via 'virtual jumpers'
  1848. allowing VERTICAL to then use the completed nets as signal
  1849. paths between FPGAs
  1850. @break
  1851. An example of a template file for a dual in line
  1852. series terminator resistor pack
  1853.  
  1854. @listing
  1855. template rp8dil
  1856.  
  1857. begin
  1858.   "" : bidir_pin = 1;
  1859.   "" : bidir_pin = 2;
  1860.   "" : bidir_pin = 3;
  1861.   "" : bidir_pin = 4;
  1862.   "" : bidir_pin = 5;
  1863.   "" : bidir_pin = 6;
  1864.   "" : bidir_pin = 7;
  1865.   "" : bidir_pin = 8;
  1866.   equivalent (1;8);
  1867.   equivalent (2;7);
  1868.   equivalent (3;6);
  1869.   equivalent (4;5);
  1870. end;
  1871. @text
  1872. The information in this file consists firstly of a list of pin
  1873. identifiers, followed by a list of which pins can be regarded
  1874. as equivalent.
  1875. @break
  1876. More than 2 pins may be included in the set of pins in an
  1877. equivalent group.
  1878. @break
  1879. If this template file has been read in then for all devices of
  1880. type 'rp8dil' the sequence of
  1881. 'template' followed by 'equivalent' will produce jumpers
  1882. across pins 1 and 8 , 2 and 7 , 3 and 6 , also 4 and 5. Then
  1883. when routing is performed, Vertical will be able to see wired
  1884. connections across the resistor packs and complete the
  1885. routing.
  1886. @break
  1887. Note that this mechanism can be applied to single resistors, or 8 pin devices with different
  1888. resistor arrangements (e.g. SIL rather than DIL).
  1889. @break
  1890. For example a two pin resistor:
  1891. @listing
  1892. template res0805
  1893.  
  1894. begin
  1895.   "" : bidir_pin = 1;
  1896.   "" : bidir_pin = 2;
  1897.   equivalent (1;2);
  1898. end;
  1899. @end
  1900.  
  1901. @title
  1902. template <socket_id_template>
  1903. @application vertical_pin
  1904. @application vertical_hdl
  1905. @application vertical_pcb
  1906. @text
  1907. Apply the templating process to all sockets whose identifiers match the given template e.g. 'U1*' which have a valid template
  1908. defining pin directions and unrouable pins for example.
  1909. @text
  1910. DO NOT define any pins that the device ought to posess according to the template but which are not used in the
  1911. netlist.
  1912. @end
  1913. */
  1914. int EnsureTemplateHandler(ET_TCLARGS)
  1915. {
  1916.  
  1917.   char * Word = NULL;
  1918.   if(argc>0)
  1919.     Word = argv[0];
  1920.   template_ensure(Word,TEMPLATE_NO_OP);
  1921.   return(TCL_OK);
  1922. }
  1923. /*********************** Create Template Command  ***************************/
  1924. /* this ensures all sockets have all pins available even if not connected to nets*/
  1925. /*
  1926. @title
  1927. create_template <socket_id_template>
  1928. @application vertical_pin
  1929. @application vertical_hdl
  1930. @application vertical_pcb
  1931. @text
  1932. Apply the templating process to all sockets whose identifiers match the given template e.g. 'U1*' which have a valid template
  1933. defining pin directions and unrouable pins for example.
  1934. @text
  1935. DEFINE any pins that the device ought to posess according to the template but which are not used in the
  1936. netlist.
  1937. @end
  1938. */
  1939. int EnsureCreateTemplateHandler(ET_TCLARGS)
  1940. {
  1941.   char * Word = NULL;
  1942.    if (argc > 0 )
  1943.      Word = argv[0];
  1944.   template_ensure(Word,TEMPLATE_CREATE_MISSING_PINS);
  1945.   return(TCL_OK);
  1946.   }
  1947. /*********************** Match Template Command  ***************************/
  1948. /* this ensures all sockets have all pins available even if not connected to nets*/
  1949. /*
  1950. @title
  1951. match_template <socket_id_template>
  1952. @application vertical_pin
  1953. @application vertical_hdl
  1954. @application vertical_pcb
  1955. @text
  1956. Apply the templating process to all sockets whose identifiers match the given template e.g. 'U1*' which have a valid template
  1957. defining pin directions and unrouable pins for example.
  1958. @text
  1959. DEFINE any pins that the device ought to posess according to the template but which are not used in the
  1960. netlist.
  1961. @break
  1962. DISCONNECT any pins that the device socket has , but which are not in the template. This is for use with FPGAs which
  1963. have fewer pins connected than there are pins in the socket (eg APEX 20k600 in a 20k1000 position)
  1964. @break
  1965. Any nets that are disconnected are also set as not routable so that they are not listed
  1966. in Verilog output.
  1967. @end
  1968. */
  1969. int EnsureMatchTemplateHandler(ET_TCLARGS)
  1970. {
  1971.   char * Word = NULL;
  1972.    if (argc > 0 )
  1973.      Word = argv[0];
  1974.   template_ensure(Word,TEMPLATE_CREATE_MISSING_PINS | TEMPLATE_DISCONNECT_PINS);
  1975.   return(TCL_OK);
  1976.   }
  1977.  
  1978.  
  1979.  
  1980. /* ********************* extract template command **********************************/
  1981. /*
  1982. @title
  1983. extract_template
  1984. @application vertical_pin
  1985. @application vertical_hdl
  1986. @application vertical_pcb
  1987. @text
  1988. This command scans the netlist for all chips or components of the same type and produces
  1989. a single description of the component in a template which is then used in write vhdl or
  1990. write verilog commands. It is also usable in other cases where chip templates are needed,
  1991. they can be extracted from the PCB netlist instead of needing additional work to create them.
  1992. @break
  1993. Pins will only be created on the template if
  1994. They are connected to a net.
  1995. @end
  1996. */
  1997.  
  1998. int ExtractTemplateHandler(ET_TCLARGS) {
  1999. /* templates are used to make VHDL component instances
  2000.    match up to the declared components */
  2001.   extract_templates();
  2002.   return(TCL_OK);
  2003. }
  2004. /*********************** modify_names Command  ***************************/
  2005. /*
  2006. @title
  2007. modify_names <socket_id> [ <alternate_prefix> ]
  2008. @application vertical_pin
  2009. @application vertical_hdl
  2010. @application vertical_pcb
  2011. @text
  2012. This affects the name of nets, not the pins of the device to which they are connected.
  2013. @break
  2014. Routable nets attached to pins on sockets are renamed to be by default socketID_pinID
  2015. in order to make them more traceable.
  2016. If an alternate prefix is given then it is used instead (not advisable if the socket name
  2017. regular expression will match more than one socket).
  2018. @end
  2019. */
  2020. int Modify_NamesHandler(ET_TCLARGS)
  2021. {
  2022.   if (argc)
  2023.     {
  2024.     alter_net_to_socket_name(argv[0],argc>1?argv[1]:NULL);
  2025.     }
  2026.   else
  2027.     {
  2028.     Log(LOG_ERROR,"-- Need at least one socket identifier for this command\n");
  2029.     return (TCL_ERROR);
  2030.     }
  2031.   return(TCL_OK);
  2032. }
  2033.  
  2034. /*********************** edit_pins type Command  ***************************/
  2035. /*
  2036. @title
  2037. edit_pins type <socket_type> <pin_match_pattern> <replacement>  
  2038. @application vertical_pin
  2039. @application vertical_hdl
  2040. @application vertical_pcb
  2041. @application regular_exp
  2042. @text
  2043. This command is a more sophisticated form of the swap command.
  2044. @break
  2045. Searching finds all sockets of a given TYPE.
  2046. @break
  2047. All sockets are searched for in both component template and netlist space.
  2048. If a socket type is matched then the pin identifiers are edited using regular expressions.
  2049.  
  2050. e.g.
  2051. @listing
  2052. edit_pins type SK ([a-z]+)([0-9]+) &2&1
  2053. @text
  2054. Will reverse  (on sockets of type 'SK) all pin identifiers identified by letters followed by digits, swapping the
  2055. letter and digit parts of the string.
  2056. @break
  2057. See edit_pins ident for more information on the regular expressions and pattern replacement of these commands.
  2058. @break
  2059. This supercedes the swap command which is kept for compatibility.
  2060.  
  2061.  
  2062. @end
  2063. */
  2064.  
  2065. int Edit_PinNames_By_ChipType_Handler(ET_TCLARGS)
  2066. {
  2067.   if (argc>=3)
  2068.     {
  2069.     edit_socket_pin_name(argv[0],argv[1],argv[2],Type);
  2070.     }
  2071.   else
  2072.     {
  2073.     Log(LOG_ERROR,"-- Need socket type, a search and replace pattern for this command\n");
  2074.     return (TCL_ERROR);
  2075.     }
  2076.   return(TCL_OK);
  2077. }
  2078.  
  2079. /*********************** edit_pins ident  Command  ***************************/
  2080. /*
  2081. @title
  2082. edit_pins ident <socket_ident> <pin_match_pattern> <replacement>  
  2083. @application vertical_pin
  2084. @application vertical_hdl
  2085. @application vertical_pcb
  2086. @application regular_exp
  2087. @text
  2088. @text
  2089. This command is a more sophisticated form of the swap command.
  2090. @break
  2091. Searching finds all sockets with matching IDENTIFIERS.
  2092. @break
  2093. If a socket identifier is matched then the pin identifiers are edited using regular expressions.
  2094.  
  2095. e.g.
  2096. @listing
  2097. edit_pins ident U[0-9] ([a-z]+)([0-9]+) &2&1
  2098. @text
  2099. Will reverse all pins identifiers on chip U0 .. U9 where the pins are identified by letters followed by digits,
  2100. swapping the
  2101. letter and digit parts of the string.
  2102. @break
  2103. The pattern &0 is a special pattern which means the whole of the string.
  2104. @listing
  2105. edit type ep20k1000efc672 .* pin_&0
  2106. @text
  2107. Will prefix all pin identifiers with "pin_" on all sockets of type ep20k1000efc672
  2108. @break
  2109. This command will also work with HDL port names...
  2110. @listing
  2111. The special patterns that can be used in the replace string are:
  2112. &0     : the whole of the matched pattern
  2113. &1..&9 : The n'th bracketed regular expression
  2114. &a     : The alphabetic = column identifier part of an alphanumeric pin ident
  2115. &n     : The numeric = row identifier part of an alphanumeric pin ident
  2116. &c     : The identifier of the connected net
  2117. &d     : The chip identifier
  2118. &i     : The numerical pin index = row + column * total_rows
  2119. @text
  2120. The &a,&n and &i patterns are extracted from the _current_ pin identifiers of the chip.
  2121. If you have already edited the pin identifiers then the pin identification is extracted from the
  2122. new pin identifier pattern. There may be some problems created if the command is
  2123. repeated on the the same chip.
  2124. @break
  2125. All of the alphabetic part of the pin identifiers are converted to numbers representing device
  2126. pin columns. Dont use this command with pin identifiers with a lot of letters like BOOT12, as the conversion of letters
  2127. to numbers can cause arithmetic overflows and strange results.
  2128. @break
  2129.  Currently the illegal characters in pin identifiers are PIN_MAP_ILLEGAL_CHARS. If these appear they are mapped onto the
  2130.  next character in the alphabet.
  2131. @break
  2132. It is possible to define the rows and columns of a chip where the pin identifiers are numeric
  2133. @listing
  2134.  
  2135. set generic attribute SK2 min_pin_row 1
  2136. set generic attribute SK2 max_pin_row 50
  2137. set generic attribute SK2 min_pin_col 0
  2138. set generic attribute SK2 max_pin_col 3
  2139. @text
  2140. This is describing a 200 pin package with 4 columns of 50 rows. Rows number from 1 to N, columns from 0 to M-1.
  2141. @end
  2142. */
  2143.  
  2144. int Edit_PinNames_By_ChipIdent_Handler(ET_TCLARGS)
  2145. {
  2146.   if (argc>=3)
  2147.     {
  2148.     edit_socket_pin_name(argv[0],argv[1],argv[2],Ident);
  2149.     }
  2150.   else
  2151.     {
  2152.     Log(LOG_ERROR,"-- Need socket ident, a search and replace pattern for this command\n");
  2153.     return (TCL_ERROR);
  2154.     }
  2155.   return(TCL_OK);
  2156. }
  2157.  
  2158.  
  2159.     CommandMenu EditPinNamesMenu =
  2160.         {
  2161.         {"ident", 3, Edit_PinNames_By_ChipIdent_Handler,NULL, "Edit pin names selecting chips by ID","<chip_name_template> <search_expr> <replace_expr>",NULL},
  2162.         {"type",  3, Edit_PinNames_By_ChipType_Handler,NULL, "Edit pin names selecting chips by Type","<chip_name_template> <search_expr> <replace_expr>",NULL},
  2163.         {NULL,        0, NULL,NULL,NULL,NULL},
  2164.         };
  2165.  
  2166.  
  2167. /*********************** edit_nets ident Command  ***************************/
  2168. /*
  2169. @title
  2170. edit_nets name <net_match_pattern> <replacement>  
  2171. @application vertical_pin
  2172. @application vertical_hdl
  2173. @application vertical_pcb
  2174. @application regular_exp
  2175. @text
  2176. This commmand matches all nets by name and then renames them according to the replacement pattern.
  2177. @listing
  2178. The special patterns that can be used in the replace string are:
  2179. &0     : the whole of the matched pattern
  2180. &1..&9 : The n'th bracketed regular expression
  2181. &n     : The net name in its entirety
  2182. &i     : The net identifier
  2183. @break
  2184. I am sure that this command is extremely dangerous but anyway it is provided.
  2185. @end
  2186. */
  2187.  
  2188. int Edit_NetNames_Handler(ET_TCLARGS)
  2189. {
  2190.   if (argc>=2)
  2191.     {
  2192.     edit_net_names(argv[0],argv[1],Name);
  2193.     }
  2194.   else
  2195.     {
  2196.     Log(LOG_ERROR,"-- Need  a search and replace pattern for this command\n");
  2197.     return (TCL_ERROR);
  2198.     }
  2199.   return(TCL_OK);
  2200. }
  2201.  
  2202. /*********************** edit_nets ident Command  ***************************/
  2203. /*
  2204. @title
  2205. edit_nets ident <net_match_pattern> <replacement>  
  2206. @application vertical_pin
  2207. @application vertical_hdl
  2208. @application vertical_pcb
  2209. @application regular_exp
  2210. @text
  2211. This commmand matches all nets by identifier and then replaces identifier according to the replacement pattern.
  2212. @listing
  2213. The special patterns that can be used in the replace string are:
  2214. &0     : the whole of the matched pattern
  2215. &1..&9 : The n'th bracketed regular expression
  2216. &n     : The net name in its entirety
  2217. &i     : The net identifier
  2218. @break
  2219. I am sure that this command is extremely dangerous but anyway it is provided.
  2220.  
  2221. @end
  2222. */
  2223.  
  2224. int Edit_NetIdents_Handler(ET_TCLARGS)
  2225. {
  2226.   if (argc>=2)
  2227.     {
  2228.     edit_net_names(argv[0],argv[1],Ident);
  2229.     }
  2230.   else
  2231.     {
  2232.     Log(LOG_ERROR,"-- Need  a search and replace pattern for this command\n");
  2233.     return (TCL_ERROR);
  2234.     }
  2235.   return(TCL_OK);
  2236. }
  2237.  
  2238.  
  2239.  
  2240.  
  2241. /*********************** Top level menu driver ******************************/
  2242.  
  2243.     CommandMenu EditNetNamesMenu =
  2244.         {
  2245.         {"name", 3, Edit_NetNames_Handler,NULL, "Edit net names ","<search_expr> <replace_expr>",NULL},
  2246.         {"ident",  3, Edit_NetIdents_Handler,NULL, "Edit net idents ","<search_expr> <replace_expr>",NULL},
  2247.         {NULL,        0, NULL,NULL,NULL,NULL},
  2248.         };
  2249.  
  2250.  
  2251. /*********************** Bundle Command  ***************************/
  2252. /*
  2253. @title
  2254. bundle <socket_id> [ <socket_id> * ]
  2255. @application vertical_hdl
  2256. @text
  2257. The bundle command is used with Certify in order to reduce the port count of a
  2258. PCB. It converts all of the signals connected to a single multipin socket into
  2259. a single bus where each pin of the bus is defined according to the connector pin identifier.
  2260. @break
  2261. The initial assumption is that each socket will have pins labelled either 'a1' or '1a' or simply numbers or letters.
  2262. @break
  2263. In each case the letter codes are regarded as the columns of the connector and
  2264. the numbers as the rows of the connector.
  2265. @break
  2266. The highest and lowest numbered rows are identified and once the number of rows is
  2267. known the array index of the bundle is defined by :
  2268. @listing
  2269. BundleIndex = RowNum-LowestRow + (ColNum-LowestCol)*TotalRows;
  2270. @text
  2271. This should always be consistent for any multipole connector.
  2272. @break
  2273. A port on the top level of the design will appear, the net identifier is the same as the
  2274. connector identifier. If Verilog printout is used then the ports will be assigned automatically to the correct signals.
  2275. @break
  2276. This command is fully implemented for working with
  2277. "write vlog", Verilog output. It is not
  2278. yet implemented for "write VHDL", VHDL output.
  2279.  
  2280. @end
  2281. */
  2282. int BundleHandler(ET_TCLARGS)
  2283. {
  2284.  
  2285.   int i = 0;
  2286.   char * Word = NULL;
  2287.   while(i<argc)
  2288.     {
  2289.     Word = argv[i++];
  2290.     wildcard_bundle(Word,1);
  2291.     }
  2292.   return(TCL_OK);
  2293. }
  2294.  
  2295.  
  2296. /*********************** UnBundle Command  ***************************/
  2297. /*
  2298. @title
  2299. unbundle <socket_id> [ <socket_id> * ]
  2300. @application vertical_hdl
  2301. @text
  2302. The unbundle command is used to undo the effect of the bundle command.
  2303. @end
  2304. */
  2305. int UnBundleHandler(ET_TCLARGS)
  2306. {
  2307.  
  2308.   int i = 0;
  2309.   char * Word = NULL;
  2310.   while(i<argc)
  2311.     {
  2312.     Word = argv[i++];
  2313.     wildcard_bundle(Word,0);
  2314.     }
  2315.   return(TCL_OK);
  2316. }
  2317.  
  2318.  
  2319.  
  2320.  
  2321.  
  2322. /*********************** Jumper Equivalent Pins Command  ***************************/
  2323. /* Connect together pin groups that are equivalent */
  2324. /*
  2325. @title
  2326. equivalent
  2327. @application vertical_pin
  2328. @application vertical_hdl
  2329. @application vertical_pcb
  2330. @text
  2331. @text
  2332. The netlist is searched for all sockets which have had a template applied to them, which includes defined
  2333. equivalent pins, or the socket has an equivalent pins section defined in the ACF source file.
  2334. @break
  2335. For these sockets,
  2336.  a netlist jumper is created to create a logical short circuit between the sets of defined equivalent pins
  2337. @break
  2338. This is used in order to create logical shorts across series termination resistors. For example from a well known FPGA672 card:
  2339. @listing
  2340. -- an ACFP template file
  2341. template resistor
  2342. begin
  2343.  "" : bidir_pin = 1;
  2344.  "" : bidir_pin = 2;
  2345.  equivalent (1;2);
  2346. end;
  2347.  
  2348.  
  2349. template "RES INNER 16R"
  2350. begin
  2351.   alias resistor;
  2352. end;
  2353.  
  2354. template "RES INNER 51R"
  2355. begin
  2356.   alias resistor;
  2357. end;
  2358. @text
  2359. Which is read in and then the template command is applied for all resistors in the design.
  2360. Only those of type 'resistor', "RES INNER 16R" and "RES INNER 51R" would have their pins
  2361. connected together in this case.
  2362. @break
  2363.  It can also be used to make e.g. bus buffers invisible for the purpose of routing signals from interface pins via a bus buffer:
  2364. something like
  2365. @listing
  2366. template bus245buf
  2367. begin
  2368.   "" : bidir pin = 2;
  2369.   "" : bidir pin = 3;
  2370. ....
  2371.  
  2372.  
  2373.   "" : bidir_pin = 18;
  2374.   "" : bidir_pin = 17;
  2375.   equivalent (2;18);
  2376.   equivalent (3;17);
  2377. ...
  2378. end;
  2379.  
  2380. template "74HCT245"
  2381. begin
  2382.   alias bus245buf;
  2383. end;
  2384.  
  2385.  
  2386. -- Schematic netlist component library naming error
  2387. -- mapped by alias template
  2388. template "bizarre245"
  2389. begin
  2390.   alias bus245buf;
  2391. end;
  2392.  
  2393. @text
  2394. Which will short out any type of 245 buffer for the purpose of signal routing. It is expected to introduce the concept
  2395. of directional jumpers to more correctly map the behaviour of a bus buffer. At the moment Vertical will not take any notice of
  2396. unidirectional buffers !
  2397. @end
  2398. */
  2399.  
  2400. int JumperEquivPairsHandler(ET_TCLARGS) {
  2401.   jumper_equivalent_pins();
  2402.   return(TCL_OK);
  2403. }
  2404.  
  2405. /*********************** Elaborate Command  ***************************/
  2406. /* Connect together pin groups that are equivalent */
  2407. /*
  2408. @title
  2409. elaborate
  2410. @application vertical_pin
  2411. @application vertical_hdl
  2412. @application vertical_pcb
  2413. @break
  2414. This performs exactly the same task as for VHDL. All component instances which use a declared
  2415. component are elaborated into unique instances of that component.
  2416. @break
  2417. Generic values are then evaluated for such things as bus widths on ports which have
  2418. variable widths defined by constants and expressions of those constants.
  2419. @break
  2420. Finally, all of the unrouted nets created by the implied connections of VHDL component
  2421. instances (port name matching and renaming via port=>fred types of mapping)
  2422. are converted into wires by creating wiring automatically.
  2423. @end
  2424. */
  2425.  
  2426.  
  2427.  
  2428. int ElaborateHandler(ET_TCLARGS) {
  2429. /* templates are used to make VHDL component instances
  2430.    match up to the declared components */
  2431.   template_ensure(NULL,Search);
  2432.   elaborate_all();
  2433.   create_vhdl_connections();
  2434.   perform_routing(By_Creating);
  2435.  
  2436.   return(TCL_OK);
  2437. }
  2438.  
  2439. /******************** Swapping pin ids on sockets.  ***************************/
  2440. /* first arg. chip ID template, second is max number of chars before letter  ***********/
  2441. /*
  2442. @title
  2443. swap <identifier> [ <style> ]
  2444. @application vertical_pin
  2445. @application vertical_pcb
  2446. @text
  2447. This is replaced by the edit_pin commands, which can do much more than this.
  2448. @break
  2449. All pin identifiers on the device identified (or identified by the "name*") type of syntax will be
  2450. converted to the defined style.
  2451. @break
  2452. Valid styles are "1a" or "a1" indicating either leading or trailing numeric parts to the
  2453. pin identifier.
  2454. @break
  2455. SO the following would happen:
  2456. @listing
  2457. Style           | A1  | A1 | 1A  | 1A
  2458. -------------------------------------
  2459. Original ident  | X32 | 4b | X32 | 4b
  2460. Swapped ident   | X32 | b4 | 32X | 4B
  2461. @text
  2462. The default style is "A1".
  2463.  
  2464. @end
  2465. */
  2466.  
  2467. int SwapIdHandler (ET_TCLARGS) {
  2468.    char *Template=NULL;
  2469.    int limit;
  2470.    AlphaSwap_t swapping;
  2471.    Log(LOG_GENERAL,"# Freezing pin renames\n");
  2472.    create_unrouted_list();
  2473.    limit = 2;
  2474.    swapping = Want_A1;
  2475.    if (argc > 0)
  2476.      Template = argv[0];
  2477.  
  2478.    if (argc > 1)
  2479.      {
  2480.      if (isalpha(argv[1][0]))
  2481.         {
  2482.         swapping = Want_A1;
  2483.         }
  2484.      else {
  2485.         swapping = Want_1A;
  2486.         }
  2487.      }
  2488.  
  2489.    if (argc > 2)
  2490.      {
  2491.      limit = atoi(argv[2]);  
  2492.      }
  2493.  
  2494.    pin_id_swap(Template,limit,swapping);
  2495.    return (TCL_OK);
  2496.    }
  2497. /*********************** SetEnv ***************************/
  2498. /* Set acfread environment */
  2499. /*
  2500. @title
  2501. setenv <name> <string>
  2502. @application vertical_pin
  2503. @application vertical_hdl
  2504. @application vertical_pcb
  2505. @text
  2506. The environment variable is a special class of generic which
  2507. is not used in e.g. VHDL listings.
  2508. @break
  2509. It is rougly equivalent to the shell environment variables
  2510. which may also be looked up by Vertical if no variable/generic
  2511. of the wanted name exists inside Vertical.
  2512. @break
  2513. Set the environment variable (looked up by $(name) within netlists)
  2514. named to be the string given. e.g.
  2515. @listing
  2516. setenv fred "A string"
  2517. echo $(fred)
  2518. @text
  2519. Will result in the string
  2520. @listing
  2521. A string
  2522. @text
  2523. appearing on standard output and in the log file.
  2524. @end
  2525. */
  2526.  
  2527. int SetEnvHandler(ET_TCLARGS) {
  2528.   generic_info_t info;
  2529.   if (argc < 2)
  2530.     return TCL_ERROR;
  2531.   info.name = argv[0];
  2532.   info.typename = "env_string";
  2533.   info.g_type   = IS_STRING;
  2534.   info.expr     = compile_string(argv[1]);
  2535.   set_generic_value(&global_generics,&info);
  2536.   return(TCL_OK);
  2537.   }
  2538.  
  2539.  
  2540. /*********************** ECHO ***************************/
  2541. /*
  2542. @title
  2543. echo [ <string>* ]
  2544. @application vertical_pin
  2545. @application vertical_hdl
  2546. @application vertical_pcb
  2547. @text
  2548. Prints out the strings given to standard output and to the
  2549. Vertical log file.
  2550. @end
  2551. */
  2552. int ECHOHandler(ET_TCLARGS) {
  2553.   int i;
  2554.   for(i=0;i<argc;i++) {
  2555.     Log(LOG_GENERAL,"%s ",argv[i]);
  2556.     };
  2557.   Log(LOG_GENERAL,"\n");
  2558.   return(TCL_OK);
  2559.   }
  2560. /*********************** ECHO quoted ***************************/
  2561. /*
  2562. @title
  2563. echoq [ <string>* ]
  2564. @application vertical_pin
  2565. @application vertical_hdl
  2566. @application vertical_pcb
  2567. @text
  2568. Prints out the strings given , with "" quotes around them to standard output and to the Vertical log file. used to check
  2569. command parser behaviour. It also can show up any variable with space characters in its value (which may be a problem)
  2570. @listing
  2571. Vertical : setenv earwig "one two "
  2572. Vertical : echoe  $(earwig)
  2573. "one two "
  2574. Vertical : echo   $(earwig)
  2575. one two
  2576. @text
  2577. In the second echo example it is not clear there is a space inside
  2578. the variable.
  2579.  
  2580. @end
  2581. */
  2582. int ECHOQHandler(ET_TCLARGS) {
  2583.   int i;
  2584.   for(i=0;i<argc;i++) {
  2585.     Log(LOG_GENERAL,"\"%s\" ",argv[i]);
  2586.     };
  2587.   Log(LOG_GENERAL,"\n");
  2588.   return(TCL_OK);
  2589.   }
  2590. /*********************** ECHO to error log ***************************/
  2591. /*
  2592. @title
  2593. echoe [ <string>* ]
  2594. @application vertical_pin
  2595. @application vertical_hdl
  2596. @application vertical_pcb
  2597. @text
  2598. This is echoe where the e stands for ERROR. Allows tagging of the error report file
  2599. with the progress of scripts. It also prints to the standard Vertical log file.
  2600. @break
  2601. Prints out the strings given to standard output and to the Vertical ERROR log file
  2602. @end
  2603. */
  2604.  
  2605. int ECHOEHandler(ET_TCLARGS) {
  2606.   int i;
  2607.   for(i=0;i<argc;i++) {
  2608.     Log(LOG_ERROR,"%s ",argv[i]);
  2609.     };
  2610.   Log(LOG_ERROR,"\n");
  2611.   for(i=0;i<argc;i++) {
  2612.     Log(LOG_GENERAL,"%s ",argv[i]);
  2613.     };
  2614.   Log(LOG_GENERAL,"\n");
  2615.  
  2616.   return(TCL_OK);
  2617.   }
  2618.  
  2619.  
  2620. /**************************************************/
  2621. /* Disconnect node handler
  2622. @title
  2623. disconnect <chip>'('<pin_ident>')'  ( <chip>'('<pin_ident>')' ) *
  2624. @application vertical_pin
  2625. @application vertical_hdl
  2626. @application vertical_pcb
  2627. @text
  2628. The pin will be disconnected from the routed net list. This is is used to delete pins
  2629. on chips which are broken. For more than a few pins on the chip it is better to use
  2630. the template command to disconnect unused pins en masse.
  2631. @break
  2632. This command has been promised for about 5 years but was implemented only in 2001.
  2633. @end
  2634. */
  2635.  
  2636. int DisconnectNodeHandler(ET_TCLARGS)
  2637.   {
  2638.   int i;
  2639.   char * s, * t , * u;
  2640.   socket_t * socket;
  2641.   node_t   * node;
  2642.   if (argc < 2)
  2643.      return(TCL_ERROR);
  2644.   for (i=0;i<argc;i++)
  2645.     {
  2646.  
  2647.     s=strdup(argv[i]);
  2648. /* look for (x) and point at it and the closing bracket */
  2649.     t=strchr(s,'(');
  2650.     if(t)
  2651.       {
  2652.       u=strchr(t,')');
  2653.       if(u)
  2654.         {
  2655.         *t++ = 0; /* terminate first half of string, point at second string */
  2656.         *u   = 0; /* terminate second  string */
  2657.         socket = find_socket(Ident,s,Search,&socket_head);
  2658.         if(socket)
  2659.           {
  2660.           node =  find_node(socket,Ident,t,Search);
  2661.           if(node)
  2662.             {
  2663.             disconnect_node(socket,node);
  2664.             }
  2665.           else
  2666.             {
  2667.             Log(LOG_GENERAL,"-- No pin '%s' on socket '%s'\n",t,s);
  2668.             }
  2669.      
  2670.           }
  2671.         else
  2672.           {
  2673.           Log(LOG_GENERAL,"-- No socket '%s'\n",s);
  2674.           }
  2675.         }
  2676.       }
  2677.     if(!t || !u)
  2678.       {
  2679.       Log(LOG_GENERAL,"-- Use chip(pin) instead of '%s'\n",argv[i]);
  2680.       }
  2681.     free(s); /* free up allocated string */
  2682.     }
  2683.   return(TCL_OK);
  2684.   }
  2685.  
  2686.  
  2687.  
  2688. /**********************************************************/
  2689. /*
  2690. @title
  2691. version
  2692. @application vertical_pin
  2693. @application vertical_hdl
  2694. @application vertical_pcb
  2695. @text
  2696. List out all of the RCS/CVS $header$ tagged modules present
  2697. in Vertical and the netlist readers. This allows for identification
  2698. of the exact versions of code used within a particular build of
  2699. Vertical.
  2700. @end
  2701. */  
  2702. int VersionHandler(ET_TCLARGS) {
  2703.   list_versions(stdout);
  2704.   return TCL_OK;
  2705.   }
  2706.  
  2707.  
  2708. /**********************************************************/
  2709. /*
  2710. @title
  2711. require <minimum_version>
  2712. @application vertical_pin
  2713. @application vertical_hdl
  2714. @application vertical_pcb
  2715. @text
  2716. The lowest release version of Vertical required to run this script is the command argument.
  2717. @break
  2718. If the Vertical version is older than that required, then an error will appear. Before Version 16.0 the error is because the
  2719. require command does not exist. Above this version, the number given is checked
  2720.  
  2721.  
  2722. @end
  2723. */  
  2724. int RequireHandler(ET_TCLARGS) {
  2725.    
  2726.  
  2727.   if (argc < 1)
  2728.     {
  2729.     return(TCL_ERROR);
  2730.     }
  2731.    
  2732.   if(strcmp(Vertical_Version,argv[0]) >= 0)
  2733.     {
  2734.     Log(LOG_GENERAL,"# Vertical version %s is OK, version %s required for this script\n",
  2735.         Vertical_Version,argv[0]);
  2736.     return(TCL_OK);
  2737.     }
  2738.   else
  2739.     {
  2740.     Log(LOG_ERROR,"# ERROR : Vertical version %s is too old , version %s required for this script\n",
  2741.         Vertical_Version,argv[0]);
  2742.        
  2743.     return(TCL_ERROR);
  2744.     }
  2745.  
  2746.  
  2747.   return TCL_OK;
  2748.   }
  2749.  
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755.  
  2756.  
  2757. /*********************** Top level menu driver ******************************/
  2758.  
  2759.     CommandMenu TopMenu =
  2760.         {
  2761.         {"bye",       3, BYEHandler,NULL, "Leave program",NULL},
  2762.         {"quit",      1, BYEHandler,NULL, "Leave program",NULL},
  2763.         {"bundle",    3, BundleHandler,NULL, "Bundle together nets leaving connector","[<chip_name_template>*]",NULL},
  2764.         {"modify_names",3, Modify_NamesHandler,NULL, "Rename nets to match chip pin identifiers"," <chip_name_template> <optional_prefix>",NULL},
  2765.         {"equivalent",3, JumperEquivPairsHandler,NULL,"Connect together equivalent pins on devices by jumpers","",NULL},
  2766.         {"elaborate", 3, ElaborateHandler,NULL,"VHDL style variable elaboration handler","",NULL},
  2767.         {"exit",      3, BYEHandler,NULL, "Leave program",NULL},
  2768.         {"extract_template",  3, ExtractTemplateHandler,NULL,"Extract component declarations from netlist","",NULL},
  2769.         {"echoe",     5, ECHOEHandler,NULL, "Expand remainder of line and print it as an error",NULL},
  2770.         {"echoq",     5, ECHOQHandler,NULL, "Expand remainder of line and print strings as quoted",NULL},
  2771.         {"echo",      4, ECHOHandler,NULL, "Expand remainder of line and print it out",NULL},
  2772.         {"edit_pins", 6, NULL,EditPinNamesMenu, "Rename pin identifiers on chips ","(more)",NULL},
  2773.         {"edit_nets", 6, NULL,EditNetNamesMenu, "Rename net identifiers ","(more)",NULL},
  2774.         {"do",        2, DOHandler,NULL,  "Run a batch file","<do_file>",NULL},
  2775.         {"read",      4, READHandler,NULL,"Read a data file in with <suffix> on net and socket IDs","<acf_file> [<suffix>] [ <args> ]",NULL},
  2776.         {"list",      4, NULL,ListMenu,   "Print information","(more)",NULL},
  2777.         {"setenv",    4, SetEnvHandler,NULL,"set environment variable","<name> <value>",NULL},
  2778.         {"set",       3, NULL,SetMenu,    "Alter part of the database","(more)",NULL},
  2779.         {"delete",    3, NULL,DeleteMenu, "Remove part of the database","(more)",NULL},
  2780.         {"disconnect",3, DisconnectNodeHandler,NULL, "Remove a pin from a chip","chip(pin)",NULL},
  2781.         {"write",     4, NULL,WriteMenu,  "Write out a data file","(more)",NULL},
  2782.         {"route",     4, ROUTEHandler,NULL,"Route the wiring",NULL},
  2783.         {"preroute",  4, NULL,PrerouteMenu,"Partially route the wiring","(more)",NULL},
  2784.         {"fix_nets",  3, FIXHandler,NULL,  "Fix unrouted connections to External ports",NULL},
  2785.         {"count_nets",3, COUNTNETSHandler,NULL,  "Count nets with less than <limit> nodes","[<limit>]",NULL},
  2786.         {"jumper",    4, JUMPERHandler,NULL,"Create new paths with unique jumpers","[<suffix>]",NULL},
  2787.         {"partition", 3, PARTHandler,NULL,"Do the partition calculation","",NULL},
  2788.         {"logging",   3, NULL,LoggingMenu,"Setup transcript logging file","(more)",NULL},
  2789.         {"debug",     3, DEBUGHandler,NULL,"Internal debugging","<debug_flags>",NULL},
  2790.         {"template",  3, EnsureTemplateHandler,NULL,"Ensure chips have correct pin directions only","[<chip_name_template>*]",NULL},
  2791.         {"create_template",  3, EnsureCreateTemplateHandler,NULL,"Ensure chips have all possible pins","[<chip_name_template>*]",NULL},
  2792.         {"match_template",  3, EnsureMatchTemplateHandler,NULL,"Ensure chips have all possible valid pins: disconnect extra pins ","[<chip_name_template>*]",NULL},
  2793.         {"connection",3, ConnectionHandler,NULL,"Connect two connectors pin for pin","<socket1> <socket2>",NULL},
  2794.         {"swap",      3, SwapIdHandler,NULL,"reverse chip pin id A23=>23A","<chip_template> <max_letters>",NULL},
  2795.         {"reserve",   3, ReservePinsHandler,NULL,"reserve pins for Altera FPGA use after routing","",NULL},
  2796.         {"require",   3, RequireHandler,NULL,"Require a given version (or later) of VERTICAL","<version>",NULL},
  2797.         {"unbundle",  3, UnBundleHandler,NULL, "Unbundle nets leaving connector","[<chip_name_template>*]",NULL},
  2798.         {"version",   3, VersionHandler,NULL,"list module versions to standard output","",NULL},
  2799.         {NULL,        0, NULL,NULL,NULL,NULL},
  2800.         };
  2801.  
  2802. /****************************************************************************/
  2803.  
  2804.