@@ -108,12 +108,12 @@ static void emit_tiletypes (pp_t *pp)
108
108
if (Technology::T->diff [j][i]) {
109
109
pp_printf (pp, " active %s" , Technology::T->diff [j][i]->getName ());
110
110
pp_nl;
111
- pp_printf (pp, " active %sc " , Technology::T->diff [j][i]->getName ());
111
+ pp_printf (pp, " active %s " , Technology::T->diff [j][i]->viaUpName ());
112
112
pp_nl;
113
113
empty = 0 ;
114
114
}
115
115
if (Technology::T->welldiff [j][i]) {
116
- pp_printf (pp, " active %sc " , Technology::T->welldiff [j][i]->getName ());
116
+ pp_printf (pp, " active %s " , Technology::T->welldiff [j][i]->viaUpName ());
117
117
pp_nl;
118
118
empty = 0 ;
119
119
}
@@ -125,7 +125,7 @@ static void emit_tiletypes (pp_t *pp)
125
125
}
126
126
}
127
127
pp_printf (pp, " active %s" , Technology::T->poly ->getName ()); pp_nl;
128
- pp_printf (pp, " active %sc " , Technology::T->poly ->getName ()); pp_nl;
128
+ pp_printf (pp, " active %s " , Technology::T->poly ->viaUpName ()); pp_nl;
129
129
pp_nl;
130
130
131
131
for (int i=0 ; i < Technology::T->nmetals ; i++) {
@@ -134,9 +134,6 @@ static void emit_tiletypes (pp_t *pp)
134
134
if (i != Technology::T->nmetals -1 ) {
135
135
pp_printf (pp, " metal%d m%dc,v%d" , i+1 , i+2 , i+1 ); pp_nl;
136
136
}
137
- else {
138
- pp_printf (pp, " metal%d" , i+1 ); pp_nl;
139
- }
140
137
}
141
138
pp_printf (pp, " comment comment" );
142
139
pp_UNTAB;
@@ -149,33 +146,33 @@ static void emit_contacts (pp_t *pp)
149
146
pp_printf (pp, " #--- contacts ---" ); pp_nl;
150
147
pp_printf (pp, " contact" ); pp_TAB;
151
148
152
- pp_printf (pp, " %sc %s metal1 " , Technology::T->poly ->getName (),
149
+ pp_printf (pp, " %s %s m1 " , Technology::T->poly ->viaUpName (),
153
150
Technology::T->poly ->getName ());
154
151
pp_nl;
155
152
for (int i=0 ; i < Technology::T->num_devs ; i++) {
156
153
for (int j=0 ; j < 2 ; j++) {
157
154
if (Technology::T->diff [j][i]) {
158
- pp_printf (pp, " %sc %s metal1 " , Technology::T->diff [j][i]->getName (),
155
+ pp_printf (pp, " %s %s m1 " , Technology::T->diff [j][i]->viaUpName (),
159
156
Technology::T->diff [j][i]->getName ());
160
157
pp_nl;
161
158
}
162
159
#if 0
163
160
if (Technology::T->well[j][i]) {
164
- pp_printf (pp, "%sc %s metal1 ", Technology::T->well[j][i]->getName (),
161
+ pp_printf (pp, "%s %s m1 ", Technology::T->well[j][i]->viaUpName (),
165
162
Technology::T->well[j][i]->getName());
166
163
pp_nl;
167
164
}
168
165
#endif
169
166
if (Technology::T->welldiff [j][i]) {
170
- pp_printf (pp, " %sc %s metal1 " , Technology::T->welldiff [j][i]->getName (),
167
+ pp_printf (pp, " %s %s m1 " , Technology::T->welldiff [j][i]->viaUpName (),
171
168
Technology::T->welldiff [j][i]->getName ());
172
169
pp_nl;
173
170
}
174
171
}
175
172
}
176
173
177
174
for (int i=1 ; i < Technology::T->nmetals ; i++) {
178
- pp_printf (pp, " m%dc metal %d metal %d" , i+1 , i, i+1 );
175
+ pp_printf (pp, " m%dc m %d m %d" , i+1 , i, i+1 );
179
176
pp_nl;
180
177
}
181
178
pp_printf (pp, " stackable" ); pp_UNTAB;
@@ -201,8 +198,8 @@ static void emit_styles (pp_t *pp)
201
198
if (Technology::T->diff [j][i]) {
202
199
pp_printf (pp, " %s %cdiffusion" ,
203
200
Technology::T->diff [j][i]->getName (), c); pp_nl;
204
- pp_printf (pp, " %sc %cdiffusion metal1 contact_X'es" ,
205
- Technology::T->diff [j][i]->getName (), c); pp_nl;
201
+ pp_printf (pp, " %s %cdiffusion metal1 contact_X'es" ,
202
+ Technology::T->diff [j][i]->viaUpName (), c); pp_nl;
206
203
}
207
204
if (Technology::T->fet [j][i]) {
208
205
pp_printf (pp, " %s %ctransistor %ctransistor_stripes" ,
@@ -211,8 +208,8 @@ static void emit_styles (pp_t *pp)
211
208
if (Technology::T->welldiff [j][i]) {
212
209
pp_printf (pp, " %s %cdiff_in_%cwell" , Technology::T->welldiff [j][i]->getName (), d, d);
213
210
pp_nl;
214
- pp_printf (pp, " %sc %cdiff_in_%cwell metal1_alt contact_X'es" ,
215
- Technology::T->welldiff [j][i]->getName (), d, d);
211
+ pp_printf (pp, " %s %cdiff_in_%cwell metal1_alt contact_X'es" ,
212
+ Technology::T->welldiff [j][i]->viaUpName (), d, d);
216
213
pp_nl;
217
214
}
218
215
if (Technology::T->sel [j][i]) {
@@ -221,8 +218,8 @@ static void emit_styles (pp_t *pp)
221
218
}
222
219
}
223
220
pp_printf (pp, " %s polysilicon" , Technology::T->poly ->getName ()); pp_nl;
224
- pp_printf (pp, " %sc poly_contact contact_X'es" ,
225
- Technology::T->poly ->getName ()); pp_nl;
221
+ pp_printf (pp, " %s poly_contact contact_X'es" ,
222
+ Technology::T->poly ->viaUpName ()); pp_nl;
226
223
227
224
228
225
for (int i=0 ; i < Technology::T->nmetals ; i++) {
@@ -233,7 +230,7 @@ static void emit_styles (pp_t *pp)
233
230
}
234
231
}
235
232
236
- pp_printf (pp, " boundary subcircuit" ); pp_nl;
233
+ // pp_printf (pp, "boundary subcircuit"); pp_nl;
237
234
pp_printf (pp, " error_p error_waffle" ); pp_nl;
238
235
pp_printf (pp, " error_s error_waffle" ); pp_nl;
239
236
pp_printf (pp, " error_ps error_waffle" ); pp_nl;
@@ -261,20 +258,26 @@ static void emit_compose (pp_t *pp)
261
258
Technology::T->diff [1 -j][i]->getName (),
262
259
Technology::T->well [j][i]->getName (),
263
260
Technology::T->diff [j][i]->getName ()); pp_nl;
264
- pp_printf (pp, " paint %sc %s %sc" ,
265
- Technology::T->diff [1 -j][i]->getName (),
266
- Technology::T->well [j][i]->getName (),
267
- Technology::T->diff [j][i]->getName ()); pp_nl;
268
261
pp_printf (pp, " paint %s %s %s" ,
269
262
Technology::T->fet [1 -j][i]->getName (),
270
263
Technology::T->well [j][i]->getName (),
271
264
Technology::T->fet [j][i]->getName ()); pp_nl;
272
- if (Technology::T->well [1 -j][i]) {
265
+
266
+ #if 0
267
+ /* add this later */
268
+ if (Technology::T->welldiff[1-j][i] &&
269
+ Technology::T->welldiff[j][i]) {
273
270
pp_printf (pp, "paint %sc %s %sc",
274
- Technology::T->well [1 -j][i]->getName (),
271
+ Technology::T->welldiff[1-j][i]->getName(),
272
+ Technology::T->well[j][i]->getName(),
273
+ Technology::T->welldiff[j][i]->getName()); pp_nl;
274
+
275
+ pp_printf (pp, "paint %sc %s %sc",
276
+ Technology::T->welldiff[1-j][i]->getName(),
275
277
Technology::T->well[j][i]->getName(),
276
278
Technology::T->well[j][i]->getName()); pp_nl;
277
279
}
280
+ #endif
278
281
}
279
282
}
280
283
}
@@ -289,15 +292,15 @@ static void emit_connect (pp_t *pp)
289
292
Material *m1, *m2;
290
293
pp_printf (pp, " connect" ); pp_TAB;
291
294
pp_printf (pp, " %s" , Technology::T->poly ->getName ());
292
- pp_printf (pp, " ,%sc /a" , Technology::T->poly ->getName ());
295
+ pp_printf (pp, " ,%s /a" , Technology::T->poly ->viaUpName ());
293
296
for (int i=0 ; i < Technology::T->num_devs ; i++) {
294
297
for (int j=0 ; j < 2 ; j++) {
295
298
pp_printf (pp, " ,%s" , Technology::T->fet [j][i]->getName ());
296
299
}
297
300
}
298
301
pp_printf (pp, " " );
299
302
pp_printf (pp, " %s" , Technology::T->poly ->getName ());
300
- pp_printf (pp, " ,%sc /a" , Technology::T->poly ->getName ());
303
+ pp_printf (pp, " ,%s /a" , Technology::T->poly ->viaUpName ());
301
304
for (int i=0 ; i < Technology::T->num_devs ; i++) {
302
305
for (int j=0 ; j < 2 ; j++) {
303
306
pp_printf (pp, " ,%s" , Technology::T->fet [j][i]->getName ());
@@ -310,46 +313,46 @@ static void emit_connect (pp_t *pp)
310
313
m1 = Technology::T->welldiff [j][i];
311
314
m2 = Technology::T->well [j][i];
312
315
if (m1 && m2) {
313
- pp_printf (pp, " %s,%s,%sc /a " , m1->getName (), m2->getName (),
314
- m1->getName ());
315
- pp_printf (pp, " %s,%s,%sc /a" , m1->getName (), m2->getName (),
316
- m1->getName ());
316
+ pp_printf (pp, " %s,%s,%s /a " , m1->getName (), m2->getName (),
317
+ m1->viaUpName ());
318
+ pp_printf (pp, " %s,%s,%s /a" , m1->getName (), m2->getName (),
319
+ m1->viaUpName ());
317
320
pp_nl;
318
321
}
319
322
320
323
m1 = Technology::T->diff [j][i];
321
324
if (m1) {
322
- pp_printf (pp, " %s,%sc /a %s,%sc /a" , m1->getName (),
323
- m1->getName (), m1->getName (), m1->getName ());
325
+ pp_printf (pp, " %s,%s /a %s,%s /a" , m1->getName (),
326
+ m1->viaUpName (), m1->getName (), m1->viaUpName ());
324
327
pp_nl;
325
328
}
326
329
}
327
330
}
328
331
329
- pp_printf (pp, " m1,m2c/m1,%sc /m1" , Technology::T->poly ->getName ());
332
+ pp_printf (pp, " m1,m2c/m1,%s /m1" , Technology::T->poly ->viaUpName ());
330
333
for (int i=0 ; i < Technology::T->num_devs ; i++) {
331
334
for (int j=0 ; j < 2 ; j++) {
332
335
m1 = Technology::T->welldiff [j][i];
333
336
if (m1) {
334
- pp_printf (pp, " ,%sc /a" , m1->getName ());
337
+ pp_printf (pp, " ,%s /a" , m1->viaUpName ());
335
338
}
336
339
m1 = Technology::T->diff [j][i];
337
340
if (m1) {
338
- pp_printf (pp, " ,%sc /a" , m1->getName ());
341
+ pp_printf (pp, " ,%s /a" , m1->viaUpName ());
339
342
}
340
343
}
341
344
}
342
345
pp_printf (pp, " " );
343
- pp_printf (pp, " m1,m2c/m1,%sc /m1" , Technology::T->poly ->getName ());
346
+ pp_printf (pp, " m1,m2c/m1,%s /m1" , Technology::T->poly ->viaUpName ());
344
347
for (int i=0 ; i < Technology::T->num_devs ; i++) {
345
348
for (int j=0 ; j < 2 ; j++) {
346
349
m1 = Technology::T->welldiff [j][i];
347
350
if (m1) {
348
- pp_printf (pp, " ,%sc /a" , m1->getName ());
351
+ pp_printf (pp, " ,%s /a" , m1->viaUpName ());
349
352
}
350
353
m1 = Technology::T->diff [j][i];
351
354
if (m1) {
352
- pp_printf (pp, " ,%sc /a" , m1->getName ());
355
+ pp_printf (pp, " ,%s /a" , m1->viaUpName ());
353
356
}
354
357
}
355
358
}
@@ -381,7 +384,7 @@ void emit_mzrouter (pp_t *pp)
381
384
pp_printf (pp, " style irouter" ); pp_nl;
382
385
pp_printf (pp, " layer m1 2 1 1 1" ); pp_nl;
383
386
pp_printf (pp, " layer %s 2 2 1 1" , Technology::T->poly ->getName ()); pp_nl;
384
- pp_printf (pp, " contact %sc m1 %s 10" , Technology::T->poly ->getName (),
387
+ pp_printf (pp, " contact %s m1 %s 10" , Technology::T->poly ->viaUpName (),
385
388
Technology::T->poly ->getName ());
386
389
pp_UNTAB;
387
390
pp_printf (pp, " end" );
@@ -472,7 +475,7 @@ void emit_extract (pp_t *pp)
472
475
pp_printf (pp, " extract" ); pp_TAB;
473
476
474
477
pp_printf (pp, " style generic" ); pp_nl;
475
- pp_printf (pp, " scale 1" ); pp_nl;
478
+ pp_printf (pp, " cscale 1" ); pp_nl;
476
479
pp_printf (pp, " lambda 5" ); pp_nl;
477
480
pp_printf (pp, " step 100" ); pp_nl;
478
481
pp_printf (pp, " sidehalo 8" ); pp_nl;
@@ -495,6 +498,8 @@ void emit_extract (pp_t *pp)
495
498
fet nfet ndiff,ndc 1 nfet GND! pwell 56 48
496
499
*/
497
500
501
+ pp_printf (pp, " planeorder comment %d" , order++);
502
+
498
503
pp_UNTAB;
499
504
pp_printf (pp, " end" );
500
505
pp_SPACE;
@@ -506,11 +511,11 @@ void emit_wiring (pp_t *pp)
506
511
507
512
pp_printf (pp, " # dummy" ); pp_nl;
508
513
for (int i=0 ; i < Technology::T->nmetals -1 ; i++) {
509
- pp_printf (pp, " contact m%dc 28 metal %d 0 metal %d 0" , i+2 ,
514
+ pp_printf (pp, " contact m%dc 28 m %d 0 m %d 0" , i+2 ,
510
515
i+1 , i+2 ); pp_nl;
511
516
}
512
- pp_printf (pp, " contact %sc 28 metal1 0 %s 0" ,
513
- Technology::T->poly ->getName (),
517
+ pp_printf (pp, " contact %s 28 m1 0 %s 0" ,
518
+ Technology::T->poly ->viaUpName (),
514
519
Technology::T->poly ->getName ());
515
520
516
521
pp_UNTAB;
@@ -523,8 +528,8 @@ void emit_router (pp_t *pp)
523
528
pp_printf (pp, " router" ); pp_TAB;
524
529
525
530
pp_printf (pp, " # dummy" ); pp_nl;
526
- pp_printf (pp, " layer1 metal1 18 m1,m2c/m1 18" ); pp_nl;
527
- pp_printf (pp, " layer2 metal2 20 m2c/m2,m3c,m2 20" ); pp_nl;
531
+ pp_printf (pp, " layer1 m1 18 m1,m2c/m1 18" ); pp_nl;
532
+ pp_printf (pp, " layer2 m2 20 m2c/m2,m3c,m2 20" ); pp_nl;
528
533
pp_printf (pp, " contacts m2c 28" ); pp_nl;
529
534
pp_printf (pp, " gridspacing 8" );
530
535
@@ -562,7 +567,7 @@ void emit_plot (pp_t *pp)
562
567
pp_printf (pp, " style pnm" ); pp_TAB;
563
568
564
569
for (int i=0 ; i < Technology::T->nmetals ; i++) {
565
- pp_printf (pp, " draw metal %d" , i+1 ); pp_nl;
570
+ pp_printf (pp, " draw m %d" , i+1 ); pp_nl;
566
571
}
567
572
pp_printf (pp, " draw polysilicon" ); pp_nl;
568
573
0 commit comments