Rev 222 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 222 | Rev 231 | ||
|---|---|---|---|
| Line 15... | Line 15... | ||
| 15 | 15 | ||
| 16 | my $pinnumwidth = 0; |
16 | my $pinnumwidth = 0; |
| 17 | my $blockname; |
17 | my $blockname; |
| 18 | 18 | ||
| 19 | # vars used later too
|
19 | # vars used later too
|
| 20 | my (%x, %y); |
20 | #my (%x, %y);
|
| 21 | 21 | ||
| 22 | # vars used during parsing
|
22 | # vars used during parsing
|
| 23 | my ($side, $busmode, $errors) = ('',0, 0); |
23 | my ($side, $busmode, $errors) = ('',0, 0); |
| 24 | # main loop which parses file
|
24 | # main loop which parses file
|
| 25 | while (<>) { |
25 | while (<>) { |
| Line 35... | Line 35... | ||
| 35 | 35 | ||
| 36 | # remove all CR/LF newlines
|
36 | # remove all CR/LF newlines
|
| 37 | s/[\r\n]+$//; |
37 | s/[\r\n]+$//; |
| 38 | 38 | ||
| 39 | # Note change of section.
|
39 | # Note change of section.
|
| 40 | if (/^\[(.*)\]/) { |
40 | if (/^\[(.*)\]/) { |
| 41 | $side = $1; |
41 | $side = $1; |
| 42 | $space = 0; |
42 | $space = 0; |
| 43 | next; |
43 | next; |
| 44 | }
|
44 | }
|
| 45 | 45 | ||
| 46 | # Start a bus
|
46 | # Start a bus
|
| 47 | if (/^\.bus/) { |
47 | if (/^\.bus/) { |
| 48 | $busmode = 1; |
48 | $busmode = 1; |
| 49 | next; |
49 | next; |
| 50 | }
|
50 | }
|
| 51 | 51 | ||
| 52 | # blank lines - cancel bus, add gap.
|
52 | # blank lines - cancel bus, add gap.
|
| 53 | if (! /\S/) { |
53 | if (! /\S/) { |
| 54 | if ($busmode) { |
54 | if ($busmode == 1) { |
| 55 | $y{$side} += 200; |
55 | $y{$side} += 200; |
| 56 | $busmode = 0; |
56 | $busmode = 0; |
| 57 | }
|
57 | }
|
| 58 | if ($space) { |
58 | if ($space) { |
| 59 | if ($side =~ /left|right/) { |
59 | if ($side =~ /left|right/) { |
| 60 | $y{$side} += 300; |
60 | $y{$side} += 300; |
| - | 61 | }
|
|
| 61 | } elsif ($side =~ /top|bottom/) { |
62 | if ($side =~ /top|bottom/) { |
| 62 | $x{$side} += 400; |
63 | $x{$side} += 400; |
| 63 | }
|
64 | }
|
| 64 | $space = 0; |
65 | $space = 0; |
| 65 | }
|
66 | }
|
| 66 | next; |
67 | next; |
| 67 | }
|
68 | }
|
| 68 | 69 | ||
| 69 | 70 | ||
| 70 | # Hidden labels are stored separately, because we don't care how
|
71 | # Hidden labels are stored separately, because we don't care how
|
| 71 | # big they are.
|
72 | # big they are.
|
| 72 | if (/! (\S.*)/ && $side eq "labels") { |
73 | if (/! (\S.*)/ && $side eq "labels") { |
| 73 | # code probably could be more smart and store labels ex in certain order
|
74 | # code probably could be more smart and store labels ex in certain order
|
| 74 | push(@attrs, $1); |
75 | push(@attrs, $1); |
| 75 | next; |
76 | next; |
| 76 | }
|
77 | }
|
| 77 | 78 | ||
| 78 | # Visible labels are stored as pins because their size affects the
|
79 | # Visible labels are stored as pins because their size affects the
|
| 79 | # size of the symbols' box.
|
80 | # size of the symbols' box.
|
| 80 | if (/\S/ && $side eq "labels") { |
81 | if (/\S/ && $side eq "labels") { |
| 81 | # an blockswith
|
82 | # an blockswith
|
| 82 | if ($_ =~ /^block=/) { |
83 | if ($_ =~ /^block=/) { |
| 83 | $blockname = $_; |
84 | $blockname = $_; |
| 84 | # printf STDERR "Blocname %s\n", $blockname;
|
85 | # printf STDERR "Blocname %s\n", $blockname;
|
| 85 | next; |
86 | next; |
| 86 | }
|
87 | }
|
| 87 | 88 | ||
| 88 | $labelpin --; |
89 | $labelpin --; |
| Line 97... | Line 98... | ||
| 97 | # Regular pins are handled here.
|
98 | # Regular pins are handled here.
|
| 98 | if (/^([0-9A-Za-z]+)\s*(.*)/) { |
99 | if (/^([0-9A-Za-z]+)\s*(.*)/) { |
| 99 | $space = 1; |
100 | $space = 1; |
| 100 | ($pin, $rest) = ($1,$2); |
101 | ($pin, $rest) = ($1,$2); |
| 101 | 102 | ||
| 102 | if ($saw_pin{$pin}) { |
103 | if ($saw_pin{$pin}) { |
| 103 | print STDERR "DUPLICATE PIN $pin (was $pinlabel{$pin}, now $rest)\n"; |
104 | print STDERR "DUPLICATE PIN $pin (was $pinlabel{$pin}, now $rest)\n"; |
| 104 | $errors ++; |
105 | $errors ++; |
| 105 | }
|
106 | }
|
| 106 | 107 | ||
| 107 | $saw_pin{$pin} = 1; |
108 | $saw_pin{$pin} = 1; |
| 108 | # our symbols use letters in names so next line wents wrong imo
|
109 | # our symbols use letters in names so next line wents wrong imo
|
| 109 | # we have two solutions, use numbers only (hard for BGA or sth like that)
|
110 | # we have two solutions, use numbers only (hard for BGA or sth like that)
|
| Line 113... | Line 114... | ||
| 113 | 114 | ||
| 114 | $pinside{$pin} = $side; |
115 | $pinside{$pin} = $side; |
| 115 | 116 | ||
| 116 | next if $side eq "nc"; |
117 | next if $side eq "nc"; |
| 117 | 118 | ||
| 118 | if ($rest =~ /^([!>]+) (.*)/) { |
119 | if ($rest =~ /^([!>]+) (.*)/) { |
| 119 | $flags = $1; |
120 | $flags = $1; |
| 120 | $pinlabel{$pin} = $2; |
121 | $pinlabel{$pin} = $2; |
| 121 | $bubble{$pin} = 1 if $flags =~ /!/; |
122 | $bubble{$pin} = 1 if $flags =~ /!/; |
| 122 | $edge{$pin} = 1 if $flags =~ />/; |
123 | $edge{$pin} = 1 if $flags =~ />/; |
| 123 | } else { |
124 | } else { |
| 124 | $pinlabel{$pin} = $rest; |
125 | $pinlabel{$pin} = $rest; |
| 125 | }
|
126 | }
|
| 126 | 127 | ||
| 127 | $rlen{$pin} = &textlen($pinlabel{$pin}); |
128 | $rlen{$pin} = &textlen($pinlabel{$pin}); |
| Line 129... | Line 130... | ||
| 129 | if ($pinnumwidth < &textlen($pin)) { |
130 | if ($pinnumwidth < &textlen($pin)) { |
| 130 | $pinnumwidth = &textlen($pin); |
131 | $pinnumwidth = &textlen($pin); |
| 131 | }
|
132 | }
|
| 132 | 133 | ||
| 133 | if ($side =~ /left|right/) { |
134 | if ($side =~ /left|right/) { |
| 134 | $y = $piny{$pin} = $y{$side}; |
135 | $y = $piny{$pin} = $y{$side}; |
| 135 | $y{$side} += ($busmode ? 200 : 300); |
136 | $y{$side} += ($busmode ? 200 : 300); |
| 136 | }
|
137 | }
|
| 137 | 138 | ||
| 138 | if ($side =~ /top|bottom/) { |
139 | if ($side =~ /top|bottom/) { |
| 139 | $tw = &alignpin((200 + $rlen{$pin}) / 2); |
140 | $tw = &alignpin((200 + $rlen{$pin}) / 2); |
| 140 | $pinx{$pin} = $w{$side} + $tw; |
141 | $pinx{$pin} = $w{$side} + $tw; |
| 141 | $w{$side} += $tw + $tw; |
142 | $w{$side} += $tw + $tw; |
| 142 | }
|
143 | }
|
| 143 | 144 | ||
| 144 | }
|
145 | }
|
| 145 | 146 | ||
| Line 155... | Line 156... | ||
| 155 | %bw = (); |
156 | %bw = (); |
| 156 | 157 | ||
| 157 | # for each horizontal slice of the symbol, keep track of how much
|
158 | # for each horizontal slice of the symbol, keep track of how much
|
| 158 | # width is used up by the left, middle, and right labels.
|
159 | # width is used up by the left, middle, and right labels.
|
| 159 | for $lp (keys %pinside) { |
160 | for $lp (keys %pinside) { |
| 160 | next unless $pinside{$lp} =~ /left|right|label/; |
161 | next unless $pinside{$lp} =~ /left|right|label/; |
| 161 | $yb = &alignpin($piny{$lp}); |
162 | $yb = &alignpin($piny{$lp}); |
| 162 | for ($y=$yb-100; $y<=$yb+100; $y+=100) { |
163 | for ($y=$yb-100; $y<=$yb+100; $y+=100) { |
| 163 | # again we got not numbers inside, so lt/gt operator dont work well.. need to track why and how fix
|
164 | # again we got not numbers inside, so lt/gt operator dont work well.. need to track why and how fix
|
| 164 | if ($bw{$y}{$pinside{$lp}} < $rlen{$lp}) { |
165 | if ($bw{$y}{$pinside{$lp}} < $rlen{$lp}) { |
| 165 | $bw{$y}{$pinside{$lp}} = $rlen{$lp}; |
166 | $bw{$y}{$pinside{$lp}} = $rlen{$lp}; |
| - | 167 | }
|
|
| 166 | }
|
168 | }
|
| 167 | }
|
- | |
| 168 | }
|
169 | }
|
| 169 | 170 | ||
| 170 | # Compute the height of the box.
|
171 | # Compute the height of the box.
|
| 171 | for $p (keys %pinside) { |
172 | for $p (keys %pinside) { |
| 172 | next unless $pinside{$p} =~ /left|right/; |
173 | next unless $pinside{$p} =~ /left|right/; |
| 173 | if ($maxy < $piny{$p}) { |
174 | if ($maxy < $piny{$p}) { |
| 174 | $maxy = $piny{$p}; |
175 | $maxy = $piny{$p}; |
| 175 | }
|
176 | }
|
| 176 | }
|
177 | }
|
| 177 | $maxy += 300; |
178 | $maxy += 300; |
| 178 | 179 | ||
| Line 188... | Line 189... | ||
| 188 | $wl = ($bw{$i}{left} + $bw{$i}{labels}/2) * 2; |
189 | $wl = ($bw{$i}{left} + $bw{$i}{labels}/2) * 2; |
| 189 | $w = $wl if $w < $wl; |
190 | $w = $wl if $w < $wl; |
| 190 | $wl = ($bw{$i}{right} + $bw{$i}{labels}/2) * 2; |
191 | $wl = ($bw{$i}{right} + $bw{$i}{labels}/2) * 2; |
| 191 | $w = $wl if $w < $wl; |
192 | $w = $wl if $w < $wl; |
| 192 | }
|
193 | }
|
| 193 | # need to review that if()'s
|
194 | # need to review that if()'s
|
| 194 | if ($bw{$i}{left} && $bw{$i}{labels}) { |
195 | if ($bw{$i}{left} && $bw{$i}{labels}) { |
| 195 | $w += 100; |
196 | $w += 100; |
| 196 | } elsif ($bw{$i}{left} && $bw{$i}{right}) { |
197 | } elsif ($bw{$i}{left} && $bw{$i}{right}) { |
| 197 | $w += 200; |
198 | $w += 200; |
| 198 | }
|
199 | }
|
| Line 251... | Line 252... | ||
| 251 | 252 | ||
| 252 | # Labels are centered in the box.
|
253 | # Labels are centered in the box.
|
| 253 | # labels have to be top, lef
|
254 | # labels have to be top, lef
|
| 254 | for $lp ($minpin..-1) { |
255 | for $lp ($minpin..-1) { |
| 255 | #$pinx{$lp} = &alignpin($boxwidth/2) + 300;
|
256 | #$pinx{$lp} = &alignpin($boxwidth/2) + 300;
|
| 256 | $pinx{$lp} = $pinnumwidth; |
257 | $pinx{$lp} = $pinnumwidth; |
| 257 | }
|
258 | }
|
| 258 | 259 | ||
| 259 | # Version.
|
260 | # Version.
|
| 260 | print "v 20060123 1\n"; |
261 | print "v 20060123 1\n"; |
| 261 | 262 | ||
| Line 285... | Line 286... | ||
| 285 | $pinx{$p} = $pinnumwidth; |
286 | $pinx{$p} = $pinnumwidth; |
| 286 | }
|
287 | }
|
| 287 | if ($pinside{$p} eq "right") { |
288 | if ($pinside{$p} eq "right") { |
| 288 | $pinx{$p} = $pinnumwidth + $boxwidth; |
289 | $pinx{$p} = $pinnumwidth + $boxwidth; |
| 289 | }
|
290 | }
|
| 290 | # here we get warning about undefined value in addition, probably one of things isnt defined..
|
291 | # here we get warning about undefined value in addition, probably one of things isnt defined..
|
| 291 | if ($p > 0 && !$saw_pin{$p}) { |
292 | if ($p > 0 && !$saw_pin{$p}) { |
| 292 | print STDERR "MISSING PIN $p\n"; |
293 | print STDERR "MISSING PIN $p\n"; |
| 293 | $errors++; |
294 | $errors++; |
| 294 | } else { |
295 | } else { |
| 295 | printf STDERR ("%3d %-6s %4d %4d %s\n", |
296 | printf STDERR ("%3d %-6s %4d %4d %s\n", |