Subversion Repositories Vertical

Rev

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

  1. /*
  2.  * $Id: statistics.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $  
  3.  *
  4.  * $Log: statistics.c,v $
  5.  * Revision 1.1.1.1  2003/11/04 23:34:57  mjames
  6.  * Imported into local repositrory
  7.  *
  8.  * Revision 1.9  2002/01/16 11:22:49  mjames
  9.  * database.h header file is read in first as it undefined DLL stuff irrelevant
  10.  * to HPUX
  11.  *
  12.  * Revision 1.8  2002/01/15 12:33:14  mjames
  13.  * removed unused variable
  14.  *
  15.  * Revision 1.7  2001/10/31 22:20:18  mjames
  16.  * Tidying up problematical comments caused by CVS
  17.  * 'intelligent' comment guessing
  18.  *
  19.  * Revision 1.6  2001/10/31 16:18:04  mjames
  20.  * Added a datastructure to hide regular expression information from programs.
  21.  * Changed call to regexec to indicate 0 subexpressions to be matched
  22.  * rather than a number dependent on strlen(string) which was wrong.
  23.  *
  24.  * Revision 1.5  2001/10/10 20:18:20  mjames
  25.  * Added a vert_regcomp function to compile regular expressions
  26.  * with '^' (match start string) and  '$' (match end string) bracketing
  27.  * this => wildcard must match entire string not just a part of it.
  28.  *
  29.  * Revision 1.4  2001/10/07 20:50:51  mjames
  30.  * Added wildcard checking (warn user about
  31.  * using wildcard '*' on the end of a string in stead of wildcard '.*')
  32.  *
  33.  * Revision 1.3  2001/09/25 23:15:22  mjames
  34.  * Converted wildcards to use proper regexp pattern match library
  35.  *
  36.  * Revision 1.2  2001/06/06 12:10:17  mjames
  37.  * Move from HPUX
  38.  *
  39.  * Revision 1.1.1.1  2000/10/19 21:58:40  mjames
  40.  * Mike put it here
  41.  *
  42.  *
  43.  * Revision 1.37  2000/10/12  14:27:48  14:27:48  mjames (Mike James)
  44.  * changed listing vhdl signals to expand expressions
  45.  * until a constant is located
  46.  *
  47.  * Revision 1.36  2000/10/04  10:37:10  10:37:10  mjames (Mike James)
  48.  * Modified for Vertical2 : support COMPONENTS and SIGNALS
  49.  *
  50.  * Revision 1.36  2000/10/04  10:37:10  10:37:10  mjames (Mike James)
  51.  * Part of Release PSAVAT01
  52.  *
  53.  * Revision 1.35  2000/10/02  11:04:21  11:04:21  mjames (Mike James)
  54.  * new_vhdl
  55.  *
  56.  * Revision 1.34  2000/09/27  14:42:21  14:42:21  mjames (Mike James)
  57.  * Part of Release Sep_27_ST_2000
  58.  *
  59.  * Revision 1.33  2000/09/21  10:15:51  10:15:51  mjames (Mike James)
  60.  * Part of Release Sep21Alpha
  61.  *
  62.  * Revision 1.32  2000/09/21  09:47:33  09:47:33  mjames (Mike James)
  63.  * Corrected <cr> problem
  64.  *
  65.  * Revision 1.31  2000/08/25  09:57:17  09:57:17  mjames (Mike James)
  66.  * Part of Release Aug25_alpha
  67.  *
  68.  * Revision 1.30  2000/08/16  08:57:33  08:57:33  mjames (Mike James)
  69.  * Part of Release CD01_Aug2000
  70.  *
  71.  * Revision 1.29  2000/08/14  14:45:14  14:45:14  mjames (Mike James)
  72.  * Part of Release Aug_14_2000
  73.  *
  74.  * Revision 1.28  2000/08/11  08:30:34  08:30:34  mjames (Mike James)
  75.  * Part of Release Aug_11_2000
  76.  *
  77.  * Revision 1.27  2000/08/09  10:31:50  10:31:50  mjames (Mike James)
  78.  * Part of Release Aug__9_2000
  79.  *
  80.  * Revision 1.26  2000/05/31  11:43:01  11:43:01  mjames (Mike James)
  81.  * Part of Release May_31_2000
  82.  *
  83.  * Revision 1.25  2000/05/08  17:01:40  17:01:40  mjames (Mike James)
  84.  * Part of Release May__8_2000
  85.  *
  86.  * Revision 1.24  2000/05/08  16:59:33  16:59:33  mjames (Mike James)
  87.  * Part of Release May__8_2000
  88.  *
  89.  * Revision 1.23  2000/05/08  16:57:10  16:57:10  mjames (Mike James)
  90.  * Part of Release May__8_2000
  91.  *
  92.  * Revision 1.22  2000/05/03  15:28:39  15:28:39  mjames (Mike James)
  93.  * Corrected abuse of null pointers
  94.  *
  95.  * Revision 1.21  2000/03/08  16:19:33  16:19:33  mjames (Mike James)
  96.  * New version including PC
  97.  *
  98.  * Revision 1.18  2000/01/20  15:58:51  15:58:51  mjames (Mike James)
  99.  * Part of Release R22
  100.  *
  101.  * Revision 1.17  99/12/22  11:15:31  11:15:31  mjames (Mike James)
  102.  * Part of Release Dec_22_1999
  103.  *
  104.  * Revision 1.16  99/06/25  14:35:52  14:35:52  mjames (Mike James)
  105.  * Added in reference to expression.h, but no changes made
  106.  * to the function of acfread yet.
  107.  *
  108.  * Revision 1.15  99/05/04  09:52:55  09:52:55  mjames (Mike James)
  109.  * General checkin
  110.  *
  111.  * Revision 1.14  98/03/16  11:39:55  11:39:55  mjames (Mike James)
  112.  * Altered XREF printout to use wildcards.
  113.  *
  114.  * Revision 1.13  98/02/11  11:27:25  11:27:25  mjames (Mike James)
  115.  * Checked in for version 6.2a
  116.  *
  117.  * Revision 1.12  97/04/23  08:43:26  08:43:26  mjames (Mike James)
  118.  * CHecked in for release rel23041997
  119.  *
  120.  * Revision 1.11  97/01/03  13:37:29  13:37:29  mjames (Mike James)
  121.  * Tidied up the ensure_reserved() function. Added in a flag to
  122.  * indicate that a net has been processed by ensure_reserved()
  123.  * And so is not in error for only having 0 or 1 nodes names (which is the
  124.  * case for a 1 or 2 node net that has been processed. One of the nodes will
  125.  * remain unnnamed and this will result in 0 or 1 nodes apparently in use
  126.  *
  127.  * Revision 1.10  96/12/23  15:15:34  15:15:34  mjames (Mike James)
  128.  * ?
  129.  *
  130.  * Revision 1.9  96/12/13  08:43:14  08:43:14  mjames (Mike James)
  131.  * Update to v5.1, added Write ID , exact routing
  132.  *
  133.  * Revision 1.8  96/08/06  13:38:57  13:38:57  mjames (Mike James)
  134.  * Added a count of nets with low numbers of nodes in the routed list.
  135.  *
  136.  * Revision 1.7  96/07/19  14:38:46  14:38:46  mjames (Mike James)
  137.  * Update to give to PRL
  138.  *
  139.  * Revision 1.6  1996/07/12  15:52:12  mjames
  140.  * Sorted out things like Alias and Jumpers
  141.  * Work Correctly
  142.  * Print COrrectly
  143.  *
  144.  * Revision 1.5  96/06/17  13:01:48  13:01:48  mjames (Mike James)
  145.  * Altered the printing of JUMPERED and ALIASED nets
  146.  * ,
  147.  *
  148.  * Revision 1.4  96/04/26  16:02:36  16:02:36  mjames (Mike James)
  149.  * Altered inside/outside determination of signal directions
  150.  *
  151.  * Revision 1.3  96/04/15  14:19:38  14:19:38  mjames (Mike James)
  152.  * Checkin before datatype printing
  153.  * modifications
  154.  *
  155.  * Revision 1.2  96/03/29  14:46:34  14:46:34  mjames (Mike James)
  156.  * Added VHDL netlist writing to the capabilities of ACFREAD
  157.  *
  158.  * Revision 1.1  96/03/26  07:47:46  07:47:46  mjames (Mike James)
  159.  * Initial revision
  160.  *  */
  161. /* The statistics module . This counts the connections between the chip and
  162.    other named chips. */
  163.  
  164. #include <stdio.h>
  165. #include <string.h>
  166. #include <stdlib.h>
  167. #include <sys/types.h>
  168. #include <regex.h>
  169.  
  170. #include "expression.h"
  171. #include "generic.h"
  172. #include "database.h"
  173.  
  174.  
  175.  
  176. #include "vertcl_main.h"
  177. #include "statistics.h"
  178. #include "cmdparse.h"
  179. #include "cmdlog.h"
  180. #include "lx_support.h"
  181. #include "chck_names.h"
  182. #include "sorting.h"
  183.  
  184. static char IDstr[] = "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/statistics.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $";
  185.  
  186.  
  187. /* this procedure counts paths from a named socket to all other named
  188.    sockets. There are two wildcard options :
  189.    no wildcard : all sockets are listed
  190.    string*     : any string beginning 'string'
  191.    *           : all named sockets  */
  192.  
  193. int count_paths(char * template)
  194. {
  195.   socket_t * skt_p, * skt_try;
  196.   noderef_t *  net_nodes;
  197.   node_t * skt_nodes ;
  198.   net_t ** list_member;
  199.   int rc;
  200.  
  201.   char * pattern;
  202.   /* compile regular expression */
  203.   vert_regex_t * preg;
  204.  
  205.  
  206.   skt_p = socket_head;
  207. /* clear all of the visit counters */
  208.   while (skt_p) {
  209.     skt_p->named_in_use_cnt =
  210.     skt_p->named_cnt =
  211.     skt_p->routed_cnt=
  212.     skt_p->unrouted_cnt = 0;
  213.     skt_p=skt_p->next;
  214.   }
  215.   if(!ISNULLSTR(template))
  216.     {
  217.     pattern = template;
  218.     }
  219.   else
  220.     {
  221.     pattern = ".*";
  222.     }
  223.  
  224.   rc = vert_regcomp(&preg,pattern);
  225.  
  226.   if (rc != 0 )
  227.     {
  228.     char errbuff[100];
  229.     regerror(rc,preg->preg,errbuff,100);
  230.     Log(LOG_ERROR,"-- Problem (rc=%d) %s with '%s' as regular expression\n",rc,errbuff,pattern);
  231.    
  232.     return TCL_ERROR;
  233.     }
  234.  
  235.   Log(LOG_GENERAL,"-- Listing xref for socket names '%s' --\n",
  236.       template?template:"[ALL Sockets]");
  237.  
  238.   skt_p = socket_head;
  239.   while(skt_p) {
  240.     int found;
  241.  
  242.     found  = regexec(preg->preg,skt_p->name,0,preg->regpatt,0);
  243.     if(!found)  {
  244.  
  245.       skt_nodes = skt_p -> nodes ;
  246. /*
  247.   fprintf(f,"named = %p , routed = %p  unrouted = %p\n",
  248.         &named_list,&routed_list,&unrouted_list);
  249. */
  250.   /* we have located the socket on the net . Let us now locate each net */
  251.   /* some nodes on a socket will be unrouted nodes on unrouted nets that
  252.      have now been resolved , and the unrouted net will have been deleted .
  253.      These have the property that node->net->list_ref = NULL */
  254.     while(skt_nodes)  {
  255.       net_t * ref_net = skt_nodes->net;
  256.       if(ref_net) {
  257.         int high,low,width,net_high,net_low;
  258.  
  259.  
  260.         net_nodes = ref_net->nodes;
  261.  
  262.  
  263.       /* note the upper and lower bound of the bundle connected from this
  264.        *    pin of this socket to the net.
  265.        * Also checking there is an associated VHDL type 4 May 2000 */
  266.         if (skt_nodes->vhdltype) {
  267.           eval_vhdl_expression(skt_nodes->vhdltype->expr,&net_high,&net_low);
  268.           }
  269.         else {
  270.           net_low = 0;
  271.           net_high= 0;
  272.           }
  273.          
  274.       /* which list is this net on */
  275.         list_member = ref_net->list_ref;
  276.         /* visit each node */
  277.         while(net_nodes){
  278.           node_t * n = net_nodes->node;
  279.           vhdl_t * vhdl= net_nodes->vhdltype;
  280.           int  vhdl_high,vhdl_low;
  281.           if (vhdl) {
  282.             /* to determine the intersection of the bundles,
  283.              * hence connection count :
  284.              * (15 downto 8) connected to (10 downto 5) has intersection
  285.              * (10 downto 8)
  286.              */
  287.             if (vhdl->expr)
  288.               eval_vhdl_expression(vhdl->expr,&vhdl_high,&vhdl_low);
  289.             else {
  290.               vhdl_high = 0;
  291.               vhdl_low  = 0;
  292.               }  
  293.         /* use the lowest high bound of the node this net comes from */
  294.           high = vhdl_high > net_high ? net_high : vhdl_high;
  295.  
  296.         /* use the highest low bound of the node this net comes from */
  297.           low  = vhdl_low  < net_low  ? net_low  : vhdl_low;
  298.                
  299.         /* now get the number of wires in the bundle */
  300.           width =  high - low + 1;
  301.           if(list_member==&named_list) {
  302.             if (n->in_use)
  303.               n->socket->named_in_use_cnt += width;
  304.             else
  305.               n->socket->named_cnt += width;
  306.           }
  307.           else if (list_member==&routed_list)
  308.             n->socket->routed_cnt   +=  width;
  309.           else if (list_member==&unrouted_list)
  310.             n->socket->unrouted_cnt +=  width;
  311.           else if (list_member!=NULL)
  312.             Log(LOG_ERROR,"# ERROR : Net %s is on unknown list pointer=%p , net \n",ref_net->name,list_member);
  313.             }
  314.           net_nodes = net_nodes->next;
  315.           }
  316.         }  
  317.       skt_nodes = skt_nodes->sktnext;
  318.       }
  319.     /* now have compiled a cross reference count */
  320.     skt_try = socket_head;
  321.     Log(LOG_GENERAL,"--  Cross reference for socket '%s'\n",skt_p->name);
  322.     Log(LOG_GENERAL,"Name            : Named&Used, Named, Routed,Unrouted\n");
  323.     skt_try = socket_head;
  324.     while(skt_try){
  325.       if(!ISNULLSTR(skt_try->name)){
  326.       Log(LOG_GENERAL,"%16s :  %5d, %5d, %5d, %5d\n",
  327.              skt_try -> name,
  328.              skt_try -> named_in_use_cnt,
  329.              skt_try -> named_cnt,
  330.              skt_try -> routed_cnt,
  331.              skt_try -> unrouted_cnt);
  332.         }
  333.       skt_try->named_in_use_cnt =
  334.       skt_try->named_cnt =
  335.       skt_try->routed_cnt=
  336.       skt_try->unrouted_cnt = 0;
  337.       skt_try = skt_try->next;
  338.       }
  339.     }
  340.   skt_p = skt_p->next;
  341.   }
  342.  
  343.   vert_regfree(&preg);
  344.   return OKCMD; /* success */
  345. }
  346.  
  347. /* this procedure counts up and displays the number of nets with less than a certain
  348.  threshold number of nodes actually in use. */
  349. void count_nets_with_few_nodes(int limit)
  350. {
  351.   long lowcount=0;
  352.   net_t * routed_net = named_list;
  353.   Log(LOG_GENERAL,"-- Checking for nets with less than or equal to %d nodes in use\n",
  354.                   limit);
  355.   while (routed_net) {
  356.     int nodecount = 0;
  357.     noderef_t * routed_nodes = routed_net->nodes;
  358.     while (routed_nodes) {
  359. /*        node_t *cnode = routed_nodes->node;  */
  360.       if (routed_nodes->node->net_assigned != 0)
  361.         nodecount++;
  362.  
  363.    routed_nodes = routed_nodes->next;
  364.       }
  365. /* turn off warning if low nodecount is due to ensure_reserved processing in routing.c */
  366.     if (nodecount <= limit && !routed_net->nodes_reserved) {
  367.       Log(LOG_GENERAL,"-- Net '%s' (name '%s') has only %d node(s) in use\n",
  368.                       routed_net->identifier,
  369.                       routed_net->name,
  370.                       nodecount);
  371.       lowcount++;
  372.       }
  373.     routed_net = routed_net->next;
  374.  
  375.     }
  376.   Log(LOG_GENERAL,"-- Found %d nets with less than %d nodes used\n",
  377.                   lowcount,limit);
  378.  
  379. }
  380.  
  381. /* keep some cc's happy */
  382. void statistics_waste(void)
  383. {
  384.   char * s=IDstr;
  385.   s=s;
  386. }
  387.  
  388.