Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | mjames | 1 | /* |
11 | mjames | 2 | * $Id: unrouted.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $ |
2 | mjames | 3 | * |
4 | * $Log: unrouted.c,v $ |
||
5 | * Revision 1.1.1.1 2003/11/04 23:34:57 mjames |
||
6 | * Imported into local repositrory |
||
7 | * |
||
8 | * Revision 1.5 2002/09/27 22:27:37 MJAMES |
||
9 | * Added lhs_expr for cases like |
||
10 | * |
||
11 | * x(0) <= y |
||
12 | * |
||
13 | * where x is std_logic_vector(0 downto 0) and y is std_logic. |
||
14 | * |
||
15 | * Revision 1.4 2002/01/16 10:08:53 mjames |
||
16 | * converted to use #ident |
||
17 | * |
||
18 | * Revision 1.3 2001/10/31 22:20:19 mjames |
||
19 | * Tidying up problematical comments caused by CVS |
||
20 | * 'intelligent' comment guessing |
||
21 | * |
||
22 | */ |
||
23 | |||
11 | mjames | 24 | #include <stdio.h> |
25 | #include <string.h> |
||
26 | #include <stdlib.h> |
||
27 | #include <ctype.h> |
||
2 | mjames | 28 | |
11 | mjames | 29 | #include "vertcl_main.h" |
2 | mjames | 30 | #include "expression.h" |
31 | #include "generic.h" |
||
11 | mjames | 32 | #include "database.h" |
2 | mjames | 33 | #include "lx_support.h" |
11 | mjames | 34 | #include "unrouted.h" |
2 | mjames | 35 | #include "statistics.h" |
11 | mjames | 36 | #include "cmdparse.h" |
37 | #include "cmdlog.h" |
||
2 | mjames | 38 | |
11 | mjames | 39 | #ident "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/unrouted.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $" |
2 | mjames | 40 | |
41 | |||
11 | mjames | 42 | |
2 | mjames | 43 | /* function that creates the node reference lists for one chip in the list , |
44 | these functions perform operations that were done inside database.c. |
||
45 | */ |
||
11 | mjames | 46 | |
47 | int create_nodes_from_refs(socket_t * socket,int donesomething) |
||
48 | { |
||
49 | unrouted_ref_t * ref,*prev; |
||
50 | node_t * cnode; |
||
51 | net_t * cnet; |
||
52 | char null_name; |
||
53 | char * netname; |
||
54 | int errseen = 0; |
||
55 | if(!socket) { |
||
56 | Log(LOG_ERROR,"-- missing socket \n"); |
||
57 | return(1); |
||
58 | } |
||
2 | mjames | 59 | |
11 | mjames | 60 | ref = socket->unrouted_refs; |
61 | while(ref) { |
||
2 | mjames | 62 | |
11 | mjames | 63 | /* pick up any new pin identifiers */ |
64 | cnode = find_node(socket,Ident,ref->identifier,Create); |
||
2 | mjames | 65 | |
11 | mjames | 66 | /* if this node is already on a net on the routed list, |
67 | it has already been linked up |
||
68 | so it should not be duplicated !! */ |
||
69 | /* iterate each node on the chip */ |
||
2 | mjames | 70 | |
11 | mjames | 71 | if ((ref->listref == &routed_list) && cnode->net) /* duplicate !!! */ |
72 | { |
||
73 | if(! errseen) { |
||
74 | errseen=1; |
||
75 | Log(LOG_ERROR,"-- Errors while creating unrouted list from pins :\n"); |
||
76 | } |
||
77 | Log(LOG_ERROR,"-- Error ! node %s(%s) is already in existence on routed net %s\n", |
||
78 | socket->identifier,ref->identifier,cnode->net->name); |
||
79 | |||
80 | } |
||
81 | else { |
||
82 | netname = ref->name; |
||
83 | null_name = ISNULLSTR(netname); |
||
84 | /* bidir pins are essentially free for routing */ |
||
85 | if (null_name || socket->is_template) { |
||
86 | if(ref->pindir != BIDIR) |
||
87 | cnode->fixed_pin = 1; |
||
88 | cnode->pindir = ref->pindir; |
||
89 | } |
||
90 | if(socket->is_template || ref->listref == &routed_list) { |
||
91 | cnode->pin_group = ref->pin_group; |
||
2 | mjames | 92 | |
11 | mjames | 93 | |
94 | cnode->vhdltype = ref->vhdltype; |
||
95 | #if defined DEBUG_EXPRESSION |
||
96 | if (cnode->vhdltype) { |
||
97 | print_msg_expression(stdout,"COPYING ",cnode->vhdltype->expr); |
||
98 | } |
||
2 | mjames | 99 | #endif |
11 | mjames | 100 | if(!null_name) |
101 | cnode->name = strdup(netname); |
||
102 | } |
||
103 | if (!socket->is_template && !null_name ) { |
||
104 | cnet = find_net(ref->listref, |
||
105 | Ident, |
||
106 | netname, |
||
107 | Create); |
||
108 | connect_node_net(ref->orig_name, |
||
109 | cnode,cnet,ref->pindir, |
||
110 | ref->vhdltype, |
||
111 | ref->orig_vhdltype, |
||
112 | ref->lhs_expr); |
||
113 | donesomething = 1; |
||
114 | }; |
||
115 | } |
||
116 | prev=ref; |
||
117 | ref= ref->next; |
||
118 | free(prev); |
||
119 | } |
||
120 | socket->unrouted_refs = NULL; /* remove any references to unrouted stuff, |
||
121 | they are all free()'d now */ |
||
2 | mjames | 122 | |
11 | mjames | 123 | return 0; |
124 | } |
||
2 | mjames | 125 | |
11 | mjames | 126 | |
2 | mjames | 127 | /* creates the unrouted list from unrouted_refs list for all sockets */ |
11 | mjames | 128 | |
129 | void create_unrouted_list(void) |
||
130 | { |
||
131 | socket_t * socket = socket_head; |
||
132 | int donesomething = 0; |
||
133 | while(socket) { |
||
134 | donesomething = create_nodes_from_refs(socket,donesomething); |
||
135 | socket=socket->next; |
||
136 | |||
137 | } |
||
138 | if(donesomething) |
||
139 | Log(LOG_GENERAL,"-- New pins converted to unrouted net\n"); |
||
2 | mjames | 140 | |
141 | } |
||
142 | |||
143 | |||
11 | mjames | 144 | void rename_unrouted_pin_socket(socket_t * socket, |
145 | char * old_name, |
||
146 | char * new_name,vhdl_t * vhdl_type) { |
||
147 | unrouted_ref_t * ref; |
||
148 | char * socket_name; |
||
149 | |||
2 | mjames | 150 | |
11 | mjames | 151 | socket_name = socket->identifier; |
2 | mjames | 152 | |
11 | mjames | 153 | ref = socket->unrouted_refs; |
154 | |||
155 | if(!ref) |
||
156 | Log(LOG_ERROR,"# ERROR pin rename : no pin '%s.%s'\n",socket_name,old_name); |
||
157 | |||
158 | |||
159 | while(ref) { |
||
160 | if(strcmp2(old_name,ref->name)==0) { |
||
161 | /* do rename only if there is a rename */ |
||
162 | if(strcmp2(ref->orig_name,ref->name)!=0) { |
||
163 | ref->orig_name = ref->name; /* keep old name in alias part */ |
||
164 | ref->name = strdup(new_name); /* and rename the unrouted node */ |
||
165 | } |
||
166 | /* if it does not have a base type then copy it */ |
||
167 | if(!vhdl_type->basetype) |
||
168 | vhdl_type->basetype = default_vhdl_datatype->basetype; |
||
2 | mjames | 169 | |
11 | mjames | 170 | /* do pinslicing only if there is a pin slice involved */ |
171 | |||
172 | if(vhdl_type != default_vhdl_datatype) { |
||
173 | ref->orig_vhdltype = ref->vhdltype; /* keep old VHDL type around */ |
||
174 | if(vhdl_type) |
||
175 | ref->vhdltype = copy_vhdl(vhdl_type,socket); /* assign the new vhdl type */ |
||
2 | mjames | 176 | |
11 | mjames | 177 | } |
178 | |||
2 | mjames | 179 | |
11 | mjames | 180 | if(level & 16) |
181 | { |
||
182 | Log(LOG_GENERAL,"# renaming '%s.%s' to be '%s'\n",socket_name,ref->orig_name,ref->name); |
||
2 | mjames | 183 | } |
11 | mjames | 184 | break; |
185 | } |
||
186 | ref=ref->next; |
||
187 | } |
||
188 | } |
||
2 | mjames | 189 | |
11 | mjames | 190 | |
191 | void rename_unrouted_pin(char * socket_name,char * old_name,char * new_name,vhdl_t * vhdl_type) { |
||
192 | socket_t * socket; |
||
193 | socket = find_socket(Ident,socket_name,Search,&socket_head); |
||
194 | if(!socket) { |
||
195 | Log(LOG_ERROR,"# ERROR connecting port : Cannot Locate socket identified as '%s'\n",socket_name); |
||
196 | } |
||
197 | else |
||
198 | rename_unrouted_pin_socket(socket,old_name,new_name,vhdl_type); |
||
199 | } |