Importing MBKVTI sources into the new CVS tree
This commit is contained in:
parent
6cab6aab32
commit
cf5f566744
|
@ -0,0 +1 @@
|
||||||
|
SUBDIRS = src
|
|
@ -0,0 +1,52 @@
|
||||||
|
dnl
|
||||||
|
dnl This file is part of the Alliance CAD System
|
||||||
|
dnl Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
dnl Universite Pierre et Marie Curie
|
||||||
|
dnl
|
||||||
|
dnl Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
dnl E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
dnl
|
||||||
|
dnl This library is free software; you can redistribute it and/or modify it
|
||||||
|
dnl under the terms of the GNU Library General Public License as published
|
||||||
|
dnl by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
dnl your option) any later version.
|
||||||
|
dnl
|
||||||
|
dnl Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
dnl Public License for more details.
|
||||||
|
dnl
|
||||||
|
dnl You should have received a copy of the GNU General Public License along
|
||||||
|
dnl with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
dnl
|
||||||
|
dnl Purpose : Auto stuffing Alliance
|
||||||
|
dnl Almost ten years since I wrote this stuff, I just can't
|
||||||
|
dnl believe it
|
||||||
|
dnl Date : 01/02/2002
|
||||||
|
dnl Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
|
||||||
|
dnl $Id: configure.in,v 1.1 2002/03/08 14:17:47 fred Exp $
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
AC_INIT(src/parse_vti_p.c)
|
||||||
|
AM_INIT_AUTOMAKE(mbkvti, 4.9)
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(strings.h unistd.h)
|
||||||
|
AC_C_CONST
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
|
changequote(,)dnl
|
||||||
|
INCLUDES=-I${ALLIANCE_INCLUDE}
|
||||||
|
LDFLAGS=-L${ALLIANCE_LIB}
|
||||||
|
changequote([,])dnl
|
||||||
|
|
||||||
|
AC_SUBST(INCLUDES)
|
||||||
|
AC_SUBST(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
AC_OUTPUT([
|
||||||
|
Makefile
|
||||||
|
src/Makefile
|
||||||
|
])
|
|
@ -0,0 +1,3 @@
|
||||||
|
lib_LIBRARIES = libMcp.a libMcl.a
|
||||||
|
libMcp_a_SOURCES = drive_vti_p.c drive_vti_p.h parse_vti_p.c mcp.h
|
||||||
|
libMcl_a_SOURCES = drive_vti_l.c drive_vti_l.h parse_vti_l.c mcl.h
|
|
@ -0,0 +1,462 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* mbk : logical vti v4r11 driver (hns, fne, hdn, fdn formats) *
|
||||||
|
* *
|
||||||
|
* version : 4.11 *
|
||||||
|
* date : 12/06/1998 *
|
||||||
|
* *
|
||||||
|
* Modified, rewritten and maintained by Frederic Petrot since september 1990 *
|
||||||
|
* Modified by Gregoire Avot : RC wire support. *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#define RCN_FLAG_USER_27 ((unsigned char) 0x00000020)
|
||||||
|
#ident "@(#)vti logical views driver version 8.00"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "drive_vti_l.h"
|
||||||
|
#include MUT_H
|
||||||
|
#include MLO_H
|
||||||
|
#include MLU_H
|
||||||
|
#include RCN_H
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* needed to allow edition with vi on big interfaces instances *
|
||||||
|
*******************************************************************************/
|
||||||
|
#define LINEBREAK if (linelength > 70) { \
|
||||||
|
(void)fputs("-\n", ptfile); \
|
||||||
|
linelength = 0; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function getdate() *
|
||||||
|
*******************************************************************************/
|
||||||
|
static void vtigetdate(date)
|
||||||
|
char *date;
|
||||||
|
{
|
||||||
|
time_t timer;
|
||||||
|
char day[4], month[4];
|
||||||
|
int year, nday, hour, minute, second;
|
||||||
|
|
||||||
|
(void)time(&timer);
|
||||||
|
(void)strcpy(date, ctime(&timer));
|
||||||
|
(void)sscanf(date, "%s %s %d %d:%d:%d 19%d",
|
||||||
|
day, month, &nday, &hour, &minute, &second, &year);
|
||||||
|
(void)sprintf(date, "%02d-%s-%02d %02d:%02d",
|
||||||
|
nday, month, year, hour, minute);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function busname *
|
||||||
|
*******************************************************************************/
|
||||||
|
static char *busname(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
static char buffer[255];
|
||||||
|
static int sigindex=0;
|
||||||
|
char *s, *t;
|
||||||
|
char one = 1;
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
sprintf(buffer,"SIG_%d",sigindex++);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = name;
|
||||||
|
t = buffer;
|
||||||
|
while (*s) {
|
||||||
|
if (*s == ' ')
|
||||||
|
if (one) {
|
||||||
|
*t++ = '[';
|
||||||
|
s++;
|
||||||
|
one = 0;
|
||||||
|
} else {
|
||||||
|
*t++ = ']';
|
||||||
|
*t++ = '[';
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
if (*s == SEPAR && !one) {
|
||||||
|
*t++ = ']';
|
||||||
|
one = 1;
|
||||||
|
}
|
||||||
|
*t++ = *s++;
|
||||||
|
}
|
||||||
|
if (!one)
|
||||||
|
*t++ = ']';
|
||||||
|
*t = '\0';
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function env() *
|
||||||
|
*******************************************************************************/
|
||||||
|
static void env(tn, tp)
|
||||||
|
char *tn, *tp;
|
||||||
|
{
|
||||||
|
char *s, *mbkgetenv(); /* what include is needed? stdlib.h but no on pc */
|
||||||
|
|
||||||
|
s = mbkgetenv("MBK_VTI_TN");
|
||||||
|
*tn = s ? *s : 'e';
|
||||||
|
if (islower(*tn))
|
||||||
|
*tn = toupper(*tn);
|
||||||
|
s = mbkgetenv("MBK_VTI_TP");
|
||||||
|
*tp = s ? *s : 'p';
|
||||||
|
if (islower(*tp))
|
||||||
|
*tp = toupper(*tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wire_point(ptsig,node,ptfile)
|
||||||
|
losig_list *ptsig;
|
||||||
|
int node;
|
||||||
|
FILE *ptfile;
|
||||||
|
{
|
||||||
|
lonode_list *ptnode;
|
||||||
|
ptype_list *ptl;
|
||||||
|
struct rcnhns *org;
|
||||||
|
|
||||||
|
ptnode=getlonode(ptsig, node);
|
||||||
|
ptl=getptype(ptnode->USER,HNSRCN_X);
|
||||||
|
|
||||||
|
if(ptl) {
|
||||||
|
fprintf(ptfile,"X %d ",(int)ptl->DATA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptl=getptype(ptnode->USER,HNSRCN_I);
|
||||||
|
if(ptl) {
|
||||||
|
org=(struct rcnhns*)(((chain_list*)(ptl->DATA))->DATA);
|
||||||
|
fprintf(ptfile,"I %s %d ",org->insname,org->position);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fprintf(ptfile,"P %ld ",ptnode->INDEX);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function savelofig() *
|
||||||
|
*******************************************************************************/
|
||||||
|
void vtisavelofig(ptfig)
|
||||||
|
lofig_list *ptfig;
|
||||||
|
{
|
||||||
|
loins_list *ptins;
|
||||||
|
lotrs_list *pttrs;
|
||||||
|
locon_list *ptcon;
|
||||||
|
losig_list *ptsig;
|
||||||
|
chain_list *ptscan, *ptlist, *scanchain;
|
||||||
|
FILE *ptfile;
|
||||||
|
long nbio;
|
||||||
|
long con_id;
|
||||||
|
float f1, f2;
|
||||||
|
char date[30];
|
||||||
|
long sig_vdd = -1, sig_vss = -1;
|
||||||
|
int linelength;
|
||||||
|
char *s;
|
||||||
|
int *old_index; /* table indexed by the file indexes giving mbk's one */
|
||||||
|
static char tn, tp;
|
||||||
|
int idx_rcn=1;
|
||||||
|
lorcnet_list *ptrcnet;
|
||||||
|
num_list *scannum;
|
||||||
|
lonode_list *ptnode;
|
||||||
|
ptype_list *ptptype;
|
||||||
|
struct rcnhns *elem_rcnhns, *org;
|
||||||
|
lowire_list *scanwire;
|
||||||
|
|
||||||
|
lofigchain( ptfig );
|
||||||
|
if (!tn) /* either one, don't matter */
|
||||||
|
env(&tn, &tp);
|
||||||
|
|
||||||
|
if ((ptfile = mbkfopen(ptfig->NAME, OUT_LO, WRITE_TEXT)) == NULL) {
|
||||||
|
(void)fflush(stdout);
|
||||||
|
(void)fprintf(stderr, "*** mbk error ***\n");
|
||||||
|
(void)fprintf(stderr, "vtisavelofig can't open file %s.%s\n",
|
||||||
|
ptfig->NAME, OUT_LO);
|
||||||
|
EXIT(1);
|
||||||
|
} else if (TRACE_MODE == YES)
|
||||||
|
(void)printf("--- mbk --- writing the file : %s.%s\n",
|
||||||
|
ptfig->NAME, OUT_LO);
|
||||||
|
|
||||||
|
/* reverse instances, connectors and parameters order */
|
||||||
|
ptfig->LOCON = (locon_list *)reverse((chain_list *)ptfig->LOCON);
|
||||||
|
ptfig->LOINS = (loins_list *)reverse((chain_list *)ptfig->LOINS);
|
||||||
|
ptfig->LOTRS = (lotrs_list *)reverse((chain_list *)ptfig->LOTRS);
|
||||||
|
for (ptins = ptfig->LOINS; ptins; ptins = ptins->NEXT)
|
||||||
|
ptins->LOCON = (locon_list *)reverse((chain_list *)ptins->LOCON);
|
||||||
|
|
||||||
|
/* space for old indexes to be restored at the end */
|
||||||
|
con_id = 1;
|
||||||
|
for (ptsig = ptfig->LOSIG; ptsig; ptsig = ptsig->NEXT)
|
||||||
|
con_id++;
|
||||||
|
old_index = (int *)mbkalloc((unsigned int)(con_id * sizeof(int)));
|
||||||
|
|
||||||
|
/* changing signals indexes : externals signals must be first for vti */
|
||||||
|
con_id = 0;
|
||||||
|
for (ptcon = ptfig->LOCON; ptcon; ptcon = ptcon->NEXT) {
|
||||||
|
old_index[++con_id] = ptcon->SIG->INDEX;
|
||||||
|
ptcon->SIG->INDEX = con_id;
|
||||||
|
ptcon->SIG->TYPE = EXTERNAL;
|
||||||
|
if (isvdd(ptcon->NAME))
|
||||||
|
sig_vdd = con_id;
|
||||||
|
else if (isvss(ptcon->NAME))
|
||||||
|
sig_vss = con_id;
|
||||||
|
ptrcnet=ptcon->SIG->PRCN;
|
||||||
|
if(ptrcnet)
|
||||||
|
if(!gettabnode(ptrcnet))
|
||||||
|
buildtable(ptcon->SIG);
|
||||||
|
}
|
||||||
|
nbio = con_id;
|
||||||
|
for (ptsig = ptfig->LOSIG; ptsig; ptsig = ptsig->NEXT) {
|
||||||
|
if (ptsig->TYPE != EXTERNAL) {
|
||||||
|
old_index[++con_id] = ptsig->INDEX;
|
||||||
|
ptsig->INDEX = con_id;
|
||||||
|
s = getsigname(ptsig);
|
||||||
|
if (isvdd(s))
|
||||||
|
sig_vdd = con_id;
|
||||||
|
else if (isvss(s))
|
||||||
|
sig_vss = con_id;
|
||||||
|
ptrcnet=ptsig->PRCN;
|
||||||
|
if(ptrcnet)
|
||||||
|
if(!gettabnode(ptrcnet))
|
||||||
|
buildtable(ptsig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sig_vdd == -1) {
|
||||||
|
sig_vdd = ++con_id;
|
||||||
|
(void)fprintf(stderr, "*** mbk warning ***\n vti %s driver detected",
|
||||||
|
OUT_LO);
|
||||||
|
(void)fprintf(stderr, " no '*vdd*' signal in figure %s (assigned to %ld)\n",
|
||||||
|
ptfig->NAME, sig_vdd);
|
||||||
|
}
|
||||||
|
if (sig_vss == -1) {
|
||||||
|
sig_vss = ++con_id;
|
||||||
|
(void)fprintf(stderr, "*** mbk warning ***\n vti %s driver detected",
|
||||||
|
OUT_LO);
|
||||||
|
(void)fprintf(stderr, " no '*vss*' signal in figure %s (assigned to %ld)\n",
|
||||||
|
ptfig->NAME, sig_vss);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
vtigetdate(date);
|
||||||
|
if (strcmp(OUT_LO, "hns") == 0) {
|
||||||
|
(void)fprintf(ptfile, "#cell1 %s %s hnSchematic 0 v7r5.6\n",
|
||||||
|
ptfig->NAME, TECHNO);
|
||||||
|
(void)fprintf(ptfile, "# %s %s mbkvti400 * .\n", date, date);
|
||||||
|
(void)fprintf(ptfile, "H 1 ;\n");
|
||||||
|
} else {
|
||||||
|
(void)fprintf(ptfile, "#cell1 %s %s fnExtracted 4096 v7r5.6\n",
|
||||||
|
ptfig->NAME, TECHNO);
|
||||||
|
(void)fprintf(ptfile, "# %s %s mbkvti400 * .\n", date, date);
|
||||||
|
(void)fprintf(ptfile, "H 3 ;\n");
|
||||||
|
}
|
||||||
|
(void)fprintf(ptfile, "B 0 %ld ;\n", nbio);
|
||||||
|
|
||||||
|
/* connectors */
|
||||||
|
for (ptcon = ptfig->LOCON; ptcon; ptcon = ptcon->NEXT) {
|
||||||
|
if( (scannum = ptcon->PNODE) ) {
|
||||||
|
for( ; scannum ; scannum=scannum->NEXT ) {
|
||||||
|
(void)fprintf(ptfile, "X "); /* unable to represent direction in hns */
|
||||||
|
(void)fprintf(ptfile, "%ld ", ptcon->SIG->INDEX);
|
||||||
|
(void)fprintf(ptfile, "%d ", idx_rcn);
|
||||||
|
ptnode=getlonode(ptcon->SIG,scannum->DATA);
|
||||||
|
ptnode->USER=addptype(ptnode->USER,HNSRCN_X,(void*)idx_rcn);
|
||||||
|
(void)fprintf(ptfile, "%s;\n", busname(ptcon->NAME));
|
||||||
|
idx_rcn++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(void)fprintf(ptfile, "X "); /* unable to represent direction in hns */
|
||||||
|
(void)fprintf(ptfile, "%ld ", ptcon->SIG->INDEX);
|
||||||
|
(void)fprintf(ptfile, "%d ", idx_rcn++);
|
||||||
|
(void)fprintf(ptfile, "%s;\n", busname(ptcon->NAME));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* local models derived from the first instances */
|
||||||
|
ptlist = NULL;
|
||||||
|
for (ptins = ptfig->LOINS; ptins; ptins = ptins->NEXT) {
|
||||||
|
idx_rcn=1;
|
||||||
|
for (ptscan = ptlist; ptscan; ptscan = ptscan->NEXT)
|
||||||
|
if (ptins->FIGNAME == (char *)ptscan->DATA)
|
||||||
|
break;
|
||||||
|
if (ptscan == NULL) {
|
||||||
|
ptlist = addchain(ptlist, (void *)ptins->FIGNAME);
|
||||||
|
linelength = fprintf(ptfile, "M HNS ");
|
||||||
|
linelength += fprintf(ptfile, "%s ", ptins->FIGNAME);
|
||||||
|
linelength += fprintf(ptfile, "| ");
|
||||||
|
linelength += fprintf(ptfile, "| ");
|
||||||
|
for (ptcon = ptins->LOCON; ptcon; ptcon = ptcon->NEXT) {
|
||||||
|
if( (scannum = ptcon->PNODE) ) {
|
||||||
|
for( ; scannum ; scannum=scannum->NEXT ) {
|
||||||
|
linelength += fprintf(ptfile, "%s ", busname(ptcon->NAME));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
linelength += fprintf(ptfile, "%s ", busname(ptcon->NAME));
|
||||||
|
}
|
||||||
|
LINEBREAK;
|
||||||
|
}
|
||||||
|
linelength += fprintf(ptfile, "| ");
|
||||||
|
LINEBREAK;
|
||||||
|
for (ptcon = ptins->LOCON; ptcon != NULL; ptcon = ptcon->NEXT) {
|
||||||
|
if( (scannum = ptcon->PNODE) ) {
|
||||||
|
for( ; scannum ; scannum=scannum->NEXT ) {
|
||||||
|
(void)fprintf(ptfile, "%d ", idx_rcn++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(void)fprintf(ptfile, "%d ", idx_rcn++);
|
||||||
|
}
|
||||||
|
LINEBREAK;
|
||||||
|
}
|
||||||
|
(void)fprintf(ptfile, ";\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
freechain(ptlist);
|
||||||
|
|
||||||
|
/* instances */
|
||||||
|
for (ptins = ptfig->LOINS; ptins != NULL; ptins = ptins->NEXT) {
|
||||||
|
|
||||||
|
idx_rcn=1;
|
||||||
|
linelength = fprintf(ptfile, "I HNS ");
|
||||||
|
linelength += fprintf(ptfile, "%s ", ptins->FIGNAME);
|
||||||
|
linelength += fprintf(ptfile, "%s ", ptins->INSNAME);
|
||||||
|
linelength += fprintf(ptfile, "| ");
|
||||||
|
linelength += fprintf(ptfile, "| ");
|
||||||
|
|
||||||
|
for (ptcon = ptins->LOCON; ptcon; ptcon = ptcon->NEXT) {
|
||||||
|
if( (scannum = ptcon->PNODE) ) {
|
||||||
|
for( ; scannum ; scannum=scannum->NEXT ) {
|
||||||
|
linelength += fprintf(ptfile, "%ld ", ptcon->SIG->INDEX);
|
||||||
|
|
||||||
|
ptnode=getlonode(ptcon->SIG,scannum->DATA);
|
||||||
|
if( !(ptptype=getptype(ptnode->USER,HNSRCN_I)) ) {
|
||||||
|
ptnode->USER=addptype(ptnode->USER,HNSRCN_I,NULL);
|
||||||
|
ptptype=ptnode->USER;
|
||||||
|
}
|
||||||
|
elem_rcnhns=mbkalloc(sizeof(struct rcnhns));
|
||||||
|
ptptype->DATA=addchain(((chain_list*)(ptptype->DATA)),elem_rcnhns);
|
||||||
|
elem_rcnhns->insname=ptins->INSNAME;
|
||||||
|
elem_rcnhns->position=idx_rcn;
|
||||||
|
RCN_CLEARFLAG(ptnode->FLAG,RCN_FLAG_USER_27);
|
||||||
|
idx_rcn++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
linelength += fprintf(ptfile, "%ld ", ptcon->SIG->INDEX);
|
||||||
|
}
|
||||||
|
LINEBREAK;
|
||||||
|
}
|
||||||
|
(void)fprintf(ptfile, ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* transistors */
|
||||||
|
for (pttrs = ptfig->LOTRS; pttrs; pttrs = pttrs->NEXT) {
|
||||||
|
(void)fprintf(ptfile, "T ");
|
||||||
|
(void)fprintf(ptfile, "%c ", pttrs->TYPE == TRANSN ? tn : tp);
|
||||||
|
(void)fprintf(ptfile, "* ");
|
||||||
|
f1 = (float)pttrs->X / SCALE_X;
|
||||||
|
f2 = (float)pttrs->Y / SCALE_X;
|
||||||
|
(void)fprintf(ptfile, "[%.2f,%.2f] ", f1, f2);
|
||||||
|
f1 = (float)pttrs->WIDTH / SCALE_X;
|
||||||
|
f2 = (float)pttrs->LENGTH / SCALE_X;
|
||||||
|
(void)fprintf(ptfile, "%.2f %.2f ", f1, f2);
|
||||||
|
(void)fprintf(ptfile, "0 ");
|
||||||
|
(void)fprintf(ptfile, "%ld ", pttrs->GRID->SIG->INDEX);
|
||||||
|
(void)fprintf(ptfile, "%ld ", pttrs->SOURCE->SIG->INDEX);
|
||||||
|
(void)fprintf(ptfile, "%ld ", pttrs->DRAIN->SIG->INDEX);
|
||||||
|
(void)fprintf(ptfile, "%ld ", pttrs->TYPE == TRANSN ? sig_vss : sig_vdd);
|
||||||
|
(void)fprintf(ptfile, ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* signals */
|
||||||
|
for (ptsig = ptfig->LOSIG; ptsig; ptsig = ptsig->NEXT) {
|
||||||
|
ptrcnet=ptsig->PRCN;
|
||||||
|
if ((ptsig->TYPE == INTERNAL && ptsig->NAMECHAIN != NULL) || ptrcnet) {
|
||||||
|
s=getsigname(ptsig);
|
||||||
|
(void)fprintf(ptfile, "N ");
|
||||||
|
(void)fprintf(ptfile, "%ld ", ptsig->INDEX);
|
||||||
|
(void)fprintf(ptfile, "%s ", busname(s));
|
||||||
|
(void)fprintf(ptfile, ";\n");
|
||||||
|
if (ptsig->PRCN && ptsig->PRCN->CAPA && strcmp(OUT_LO, "hns")) {
|
||||||
|
(void)fprintf(ptfile, "C 0 * * "); /* type */
|
||||||
|
(void)fprintf(ptfile, "%.3e ", ptsig->PRCN->CAPA); /* val */
|
||||||
|
(void)fprintf(ptfile, "%ld ", ptsig->INDEX); /* equi */
|
||||||
|
(void)fprintf(ptfile, "%ld ", sig_vss); /* bulk */
|
||||||
|
(void)fprintf(ptfile, ";\n");
|
||||||
|
}
|
||||||
|
if(ptrcnet) {
|
||||||
|
for(scanwire=ptrcnet->PWIRE;scanwire;scanwire=scanwire->NEXT) {
|
||||||
|
(void)fprintf(ptfile, "W ");
|
||||||
|
wire_point(ptsig,scanwire->NODE1,ptfile);
|
||||||
|
wire_point(ptsig,scanwire->NODE2,ptfile);
|
||||||
|
(void)fprintf(ptfile,"%.3e %.3e\n",scanwire->RESI,scanwire->CAPA);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(scanchain=getptype(ptsig->USER,LOFIGCHAIN)->DATA;scanchain;scanchain=scanchain->NEXT) {
|
||||||
|
ptcon=(locon_list*)(scanchain->DATA);
|
||||||
|
for(scannum=ptcon->PNODE;scannum;scannum=scannum->NEXT) {
|
||||||
|
ptnode=getlonode(ptsig,scannum->DATA);
|
||||||
|
if( !RCN_GETFLAG(ptnode->FLAG,RCN_FLAG_USER_27) ) {
|
||||||
|
if( (ptptype=getptype(ptnode->USER,HNSRCN_I)) ) {
|
||||||
|
org=((struct rcnhns*)(((chain_list*)(ptptype->DATA))->DATA));
|
||||||
|
for(ptscan=((chain_list*)(ptptype->DATA))->NEXT;ptscan;ptscan=ptscan->NEXT) {
|
||||||
|
elem_rcnhns=(struct rcnhns*)(ptscan->DATA);
|
||||||
|
fprintf(ptfile,"W I %s %d I %s %d 0.0 0.0\n",elem_rcnhns->insname,elem_rcnhns->position,org->insname,org->position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RCN_SETFLAG(ptnode->FLAG,RCN_FLAG_USER_27);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)fprintf(ptfile, "E ;\n");
|
||||||
|
|
||||||
|
/* put back indexes in their place */
|
||||||
|
for (ptsig = ptfig->LOSIG; ptsig; ptsig = ptsig->NEXT)
|
||||||
|
ptsig->INDEX = old_index[ptsig->INDEX];
|
||||||
|
mbkfree(old_index);
|
||||||
|
|
||||||
|
/* reverse instances, connectors and transistor order */
|
||||||
|
ptfig->LOCON = (locon_list *)reverse((chain_list *)ptfig->LOCON);
|
||||||
|
ptfig->LOTRS = (lotrs_list *)reverse((chain_list *)ptfig->LOTRS);
|
||||||
|
ptfig->LOINS = (loins_list *)reverse((chain_list *)ptfig->LOINS);
|
||||||
|
for (ptins = ptfig->LOINS; ptins; ptins = ptins->NEXT)
|
||||||
|
ptins->LOCON = (locon_list *)reverse((chain_list *)ptins->LOCON);
|
||||||
|
|
||||||
|
if (fclose(ptfile)) {
|
||||||
|
(void)fflush(stdout);
|
||||||
|
(void)fprintf(stderr, "*** mbk error ***\n");
|
||||||
|
(void)fprintf(stderr, "vtisavelofig can't close file %s.%s\n",
|
||||||
|
ptfig->NAME, OUT_LO);
|
||||||
|
EXIT(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* drive_vti_l.h : header file for the hns and fne driver *
|
||||||
|
* *
|
||||||
|
* version : 4.11 *
|
||||||
|
* date : 12/06/1998 *
|
||||||
|
* *
|
||||||
|
* Modified, rewritten and maintained by Frederic Petrot since september 1990 *
|
||||||
|
* Modified by Gregoire Avot for RCN support. *
|
||||||
|
*******************************************************************************/
|
||||||
|
static void vtigetdate();
|
||||||
|
void vtisavelofig();
|
||||||
|
|
||||||
|
#define HNSRCN_X 543345
|
||||||
|
#define HNSRCN_I 543346
|
||||||
|
struct rcnhns {
|
||||||
|
char *insname;
|
||||||
|
int position;
|
||||||
|
};
|
||||||
|
|
||||||
|
void wire_point();
|
|
@ -0,0 +1,497 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* mbk : physical vti v7r5 & v8 driver (cp format) *
|
||||||
|
* *
|
||||||
|
* version : 3.05 *
|
||||||
|
* date : 13/05/92 *
|
||||||
|
* *
|
||||||
|
* Modified, rewritten and maintained by Frederic Petrot since september 1990 *
|
||||||
|
* *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ident "@(#)vti symbolic layout view driver version 4.00"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include MUT_H
|
||||||
|
#include MPH_H
|
||||||
|
#include MPU_H
|
||||||
|
#include "drive_vti_p.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function getdate() *
|
||||||
|
*******************************************************************************/
|
||||||
|
static void vtigetdate(date)
|
||||||
|
char *date;
|
||||||
|
{
|
||||||
|
time_t timer;
|
||||||
|
char day[4], month[4];
|
||||||
|
int year, nday, hour, minute, second;
|
||||||
|
|
||||||
|
(void)time(&timer);
|
||||||
|
(void)strcpy(date, ctime(&timer));
|
||||||
|
(void)sscanf(date, "%s %s %d %d:%d:%d 19%d",
|
||||||
|
day, month, &nday, &hour, &minute, &second, &year);
|
||||||
|
(void)sprintf(date, "%02d-%s-%02d %02d:%02d",
|
||||||
|
nday, month, year, hour, minute);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function busname *
|
||||||
|
*******************************************************************************/
|
||||||
|
static char *busname(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
static char buffer[255];
|
||||||
|
char *s, *t;
|
||||||
|
char one = 1;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
s = name;
|
||||||
|
t = buffer;
|
||||||
|
while (*s) {
|
||||||
|
if (*s == ' ')
|
||||||
|
if (one) {
|
||||||
|
*t++ = '[';
|
||||||
|
s++;
|
||||||
|
one = 0;
|
||||||
|
} else {
|
||||||
|
*t++ = ']';
|
||||||
|
*t++ = '[';
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
if (*s == '_' && !one) { /* was SEPAR and not / */
|
||||||
|
*t++ = ']';
|
||||||
|
one = 1;
|
||||||
|
}
|
||||||
|
*t++ = *s++;
|
||||||
|
}
|
||||||
|
if (!one)
|
||||||
|
*t++ = ']';
|
||||||
|
*t = '\0';
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function vtisavephfig() *
|
||||||
|
*******************************************************************************/
|
||||||
|
void vtisavephfig(ptfig)
|
||||||
|
phfig_list *ptfig;
|
||||||
|
{
|
||||||
|
chain_list *ptchain;
|
||||||
|
phcon_list *ptcon;
|
||||||
|
phins_list *ptins;
|
||||||
|
phseg_list *ptseg;
|
||||||
|
phvia_list *ptvia;
|
||||||
|
phref_list *ptref;
|
||||||
|
int npoint = 0;
|
||||||
|
int vix[LAST_CONTACT];
|
||||||
|
int conindex = 0; /* connector index */
|
||||||
|
char symm;
|
||||||
|
char type; /* connector orient */
|
||||||
|
char *filename = ptfig->NAME; /* namealloc unnecessary */
|
||||||
|
char figname[10];
|
||||||
|
char insname[10];
|
||||||
|
FILE *ptfile;
|
||||||
|
float f1, f2, f3, f4, f5;
|
||||||
|
char date[30];
|
||||||
|
|
||||||
|
/* open file */
|
||||||
|
if ((ptfile = mbkfopen(filename, OUT_PH, WRITE_TEXT)) == (FILE *)NULL) {
|
||||||
|
(void)fflush(stdout);
|
||||||
|
(void)fprintf(stderr, "*** mbk error ***\n");
|
||||||
|
(void)fprintf(stderr, "vtisavephfig can't open file %s.%s\n",
|
||||||
|
filename, OUT_PH);
|
||||||
|
EXIT(1);
|
||||||
|
} else if (TRACE_MODE == 'Y')
|
||||||
|
(void)printf("--- mbk --- writing file %s.%s\n", filename, OUT_PH);
|
||||||
|
|
||||||
|
(void)memset(vix, (char)0, sizeof(vix));
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
vtigetdate(date);
|
||||||
|
(void)fprintf(ptfile, "#cell1 %s %s compose *\n", ptfig->NAME, TECHNO);
|
||||||
|
(void)fprintf(ptfile, "# %s %s mbkvti400 * .cp\n", date, date);
|
||||||
|
for (ptchain = ptfig->MODELCHAIN; ptchain; ptchain = ptchain->NEXT)
|
||||||
|
(void)fprintf(ptfile, "# %s\n", (char *)ptchain->DATA);
|
||||||
|
(void)fprintf(ptfile, "# .\n");
|
||||||
|
(void)fprintf(ptfile, "V 4 VTIcompose 1.1\n");
|
||||||
|
|
||||||
|
/* boxes */
|
||||||
|
f1 = (float)ptfig->XAB1 / SCALE_X;
|
||||||
|
f2 = (float)ptfig->YAB1 / SCALE_X;
|
||||||
|
f3 = (float)ptfig->XAB2 / SCALE_X;
|
||||||
|
f4 = (float)ptfig->YAB2 / SCALE_X;
|
||||||
|
(void)fprintf(ptfile, "A %g %g %g %g\n", f1, f2, f3, f4);
|
||||||
|
(void)fprintf(ptfile, "B %g %g %g %g\n", f1, f2, f3, f4);
|
||||||
|
|
||||||
|
(void)fprintf(ptfile, "F F\n");
|
||||||
|
|
||||||
|
/* connectors */
|
||||||
|
for (ptcon = ptfig->PHCON; ptcon; ptcon = ptcon->NEXT) {
|
||||||
|
switch (ptcon->ORIENT) {
|
||||||
|
case NORTH :
|
||||||
|
type = 'N';
|
||||||
|
break;
|
||||||
|
case EAST :
|
||||||
|
type = 'E';
|
||||||
|
break;
|
||||||
|
case SOUTH :
|
||||||
|
type = 'S';
|
||||||
|
break;
|
||||||
|
case WEST :
|
||||||
|
type = 'W';
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
if (ptcon->XCON != ptfig->XAB1 && ptcon->XCON != ptfig->XAB2
|
||||||
|
&& ptcon->YCON != ptfig->YAB1 && ptcon->YCON != ptfig->YAB2) {
|
||||||
|
(void)fprintf(stderr, "*** mbk warning ***\n");
|
||||||
|
(void)fprintf(stderr, "vti connector not on abutment box : ");
|
||||||
|
(void)fprintf(stderr, "x = %d , y = %d , name = %s , orient = %c\n",
|
||||||
|
ptcon->XCON, ptcon->YCON,
|
||||||
|
ptcon->NAME, ptcon->ORIENT);
|
||||||
|
(void)fprintf(stderr, "writing the file %s.%s\n", filename, OUT_PH);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
f1 = (float)ptcon->XCON / SCALE_X;
|
||||||
|
f2 = (float)ptcon->YCON / SCALE_X;
|
||||||
|
f3 = (float)ptcon->WIDTH / SCALE_X;
|
||||||
|
(void)fprintf(ptfile, "C %s %g %g %s %g %d *",
|
||||||
|
busname(ptcon->NAME), f1, f2, decodelayer(ptcon->LAYER),
|
||||||
|
f3, ++conindex);
|
||||||
|
(void)fprintf(ptfile, " * %c %s\n", type, busname(ptcon->NAME));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* instances */
|
||||||
|
for (ptins = ptfig->PHINS; ptins; ptins = ptins->NEXT) {
|
||||||
|
switch (ptins->TRANSF) {
|
||||||
|
case NOSYM :
|
||||||
|
symm = 0;
|
||||||
|
break;
|
||||||
|
case SYM_Y :
|
||||||
|
symm = 6;
|
||||||
|
break;
|
||||||
|
case SYM_X :
|
||||||
|
symm = 4;
|
||||||
|
break;
|
||||||
|
case SYMXY :
|
||||||
|
symm = 2;
|
||||||
|
break;
|
||||||
|
case ROT_P :
|
||||||
|
symm = 1;
|
||||||
|
break;
|
||||||
|
case ROT_M :
|
||||||
|
symm = 3;
|
||||||
|
break;
|
||||||
|
case SY_RM :
|
||||||
|
symm = 5;
|
||||||
|
break;
|
||||||
|
case SY_RP :
|
||||||
|
symm = 7;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
symm = -15;
|
||||||
|
}
|
||||||
|
f1 = (float)ptins->XINS / SCALE_X;
|
||||||
|
f2 = (float)ptins->YINS / SCALE_X;
|
||||||
|
(void)fprintf(ptfile, "I %s %g %g %d \"%s\" cp * *\n",
|
||||||
|
busname(ptins->INSNAME), f1, f2, symm, ptins->FIGNAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* contacts */
|
||||||
|
for (ptvia = ptfig->PHVIA; ptvia; ptvia = ptvia->NEXT) {
|
||||||
|
switch (ptvia->TYPE) {
|
||||||
|
case CONT_VIA :
|
||||||
|
(void)strcpy(figname, "VIA12");
|
||||||
|
(void)sprintf(insname, "via12x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA2 :
|
||||||
|
(void)strcpy(figname, "VIA23");
|
||||||
|
(void)sprintf(insname, "via23x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA3 :
|
||||||
|
(void)strcpy(figname, "VIA34");
|
||||||
|
(void)sprintf(insname, "via34x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA4 :
|
||||||
|
(void)strcpy(figname, "VIA45");
|
||||||
|
(void)sprintf(insname, "via45x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA5 :
|
||||||
|
(void)strcpy(figname, "VIA56");
|
||||||
|
(void)sprintf(insname, "via56x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA6 :
|
||||||
|
(void)strcpy(figname, "VIA67");
|
||||||
|
(void)sprintf(insname, "via67x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA7 :
|
||||||
|
(void)strcpy(figname, "VIA78");
|
||||||
|
(void)sprintf(insname, "via78x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_VIA8 :
|
||||||
|
(void)strcpy(figname, "VIA89");
|
||||||
|
(void)sprintf(insname, "via89x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_POLY :
|
||||||
|
(void)strcpy(figname, "CPF");
|
||||||
|
(void)sprintf(insname, "cpf%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_POLY2 :
|
||||||
|
(void)strcpy(figname, "CPF2");
|
||||||
|
(void)sprintf(insname, "cpf2%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_DIF_N :
|
||||||
|
(void)strcpy(figname, "CDN");
|
||||||
|
(void)sprintf(insname, "cdn%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_DIF_P :
|
||||||
|
(void)strcpy(figname, "CDP");
|
||||||
|
(void)sprintf(insname, "cdp%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_BODY_N :
|
||||||
|
(void)strcpy(figname, "CBN");
|
||||||
|
(void)sprintf(insname, "cbn%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_BODY_P :
|
||||||
|
(void)strcpy(figname, "CBP");
|
||||||
|
(void)sprintf(insname, "cbp%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case C_X_N :
|
||||||
|
(void)strcpy(figname, "CXN");
|
||||||
|
(void)sprintf(insname, "cxn%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case C_X_P :
|
||||||
|
(void)strcpy(figname, "CXP");
|
||||||
|
(void)sprintf(insname, "cxp%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN1 :
|
||||||
|
(void)strcpy(figname, "TURN1");
|
||||||
|
(void)sprintf(insname, "turn1x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN2 :
|
||||||
|
(void)strcpy(figname, "TURN2");
|
||||||
|
(void)sprintf(insname, "turn2x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN3 :
|
||||||
|
(void)strcpy(figname, "TURN3");
|
||||||
|
(void)sprintf(insname, "turn3x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN4 :
|
||||||
|
(void)strcpy(figname, "TURN4");
|
||||||
|
(void)sprintf(insname, "turn4x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN5 :
|
||||||
|
(void)strcpy(figname, "TURN5");
|
||||||
|
(void)sprintf(insname, "turn5x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN6 :
|
||||||
|
(void)strcpy(figname, "TURN6");
|
||||||
|
(void)sprintf(insname, "turn6x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN7 :
|
||||||
|
(void)strcpy(figname, "TURN7");
|
||||||
|
(void)sprintf(insname, "turn7x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN8 :
|
||||||
|
(void)strcpy(figname, "TURN8");
|
||||||
|
(void)sprintf(insname, "turn8x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
case CONT_TURN9 :
|
||||||
|
(void)strcpy(figname, "TURN9");
|
||||||
|
(void)sprintf(insname, "turn9x%d", ++vix[(int)ptvia->TYPE]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
f1 = (float)ptvia->XVIA / SCALE_X;
|
||||||
|
f2 = (float)ptvia->YVIA / SCALE_X;
|
||||||
|
if ( ( ptvia->DX == 0 ) &&
|
||||||
|
( ptvia->DY == 0 ) )
|
||||||
|
{
|
||||||
|
(void)fprintf(ptfile, "I %s %g %g %d \"%s\" ly * *\n",
|
||||||
|
insname, f1, f2, NOSYM, namealloc( figname ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f3 = (float)ptvia->DX / SCALE_X;
|
||||||
|
f4 = (float)ptvia->DY / SCALE_X;
|
||||||
|
|
||||||
|
(void)fprintf(ptfile, "D %g %g * %s 0 %g %g\n", f1, f2, figname, f3, f4 );
|
||||||
|
++npoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* references */
|
||||||
|
for (ptref = ptfig->PHREF; ptref; ptref = ptref->NEXT) {
|
||||||
|
f1 = (float)ptref->XREF / SCALE_X;
|
||||||
|
f2 = (float)ptref->YREF / SCALE_X;
|
||||||
|
(void)fprintf(ptfile, "I %s %g %g %d \"%s\" ly * *\n",
|
||||||
|
busname(ptref->NAME), f1, f2, NOSYM, ptref->FIGNAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* segments */
|
||||||
|
for (ptseg = ptfig->PHSEG; ptseg; ptseg = ptseg->NEXT) {
|
||||||
|
f1 = (float)ptseg->X1 / SCALE_X;
|
||||||
|
f2 = (float)ptseg->Y1 / SCALE_X;
|
||||||
|
f3 = (float)ptseg->X2 / SCALE_X;
|
||||||
|
f4 = (float)ptseg->Y2 / SCALE_X;
|
||||||
|
f5 = (float)ptseg->WIDTH / SCALE_X;
|
||||||
|
if (ptseg->TYPE == UP || ptseg->TYPE == RIGHT ) {
|
||||||
|
(void)fprintf(ptfile, "P %g %g * %s\n", f1, f2,
|
||||||
|
decodelayer(ptseg->LAYER));
|
||||||
|
(void)fprintf(ptfile, "P %g %g * %s\n", f3, f4,
|
||||||
|
decodelayer(ptseg->LAYER));
|
||||||
|
} else {
|
||||||
|
(void)fprintf(ptfile, "P %g %g * %s\n", f3, f4,
|
||||||
|
decodelayer(ptseg->LAYER));
|
||||||
|
(void)fprintf(ptfile, "P %g %g * %s\n", f1, f2,
|
||||||
|
decodelayer(ptseg->LAYER));
|
||||||
|
}
|
||||||
|
if (ptseg->NAME == NULL || *ptseg->NAME == '*')
|
||||||
|
(void)fprintf(ptfile, "W %g %g %g %g\n",
|
||||||
|
f1 - f5, f2 - f5, f3 + f5, f4 + f5);
|
||||||
|
else
|
||||||
|
(void)fprintf(ptfile, "W %g %g %g %g %s\n",
|
||||||
|
f1 - f5, f2 - f5, f3 + f5, f4 + f5,
|
||||||
|
busname(ptseg->NAME));
|
||||||
|
++npoint;
|
||||||
|
(void)fprintf(ptfile, "S %g %s %s P %d P %d\n", f5,
|
||||||
|
(ptseg->TYPE == UP || ptseg->TYPE == DOWN) ? "V" : "H",
|
||||||
|
decodelayer(ptseg->LAYER), npoint, npoint + 1);
|
||||||
|
++npoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end */
|
||||||
|
(void)fprintf(ptfile, "E\n");
|
||||||
|
|
||||||
|
/* close file */
|
||||||
|
if (fclose(ptfile)) {
|
||||||
|
(void)fflush(stdout);
|
||||||
|
(void)fprintf(stderr, "*** mbk error ***\n");
|
||||||
|
(void)fprintf(stderr, "vtisavephfig can't close file %s.%s\n",
|
||||||
|
filename, OUT_PH);
|
||||||
|
EXIT(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* function decodelayer() *
|
||||||
|
*******************************************************************************/
|
||||||
|
static char *decodelayer(index)
|
||||||
|
char index;
|
||||||
|
{
|
||||||
|
switch(index) {
|
||||||
|
case NWELL:
|
||||||
|
return "nwell";
|
||||||
|
case PWELL:
|
||||||
|
return "pwell";
|
||||||
|
case NTIE:
|
||||||
|
return "ntie";
|
||||||
|
case PTIE:
|
||||||
|
return "ptie";
|
||||||
|
case NDIF:
|
||||||
|
return "ndif";
|
||||||
|
case PDIF:
|
||||||
|
return "pdif";
|
||||||
|
case NTRANS:
|
||||||
|
return "ntrans";
|
||||||
|
case PTRANS:
|
||||||
|
return "ptrans";
|
||||||
|
case NTRANS_FAST:
|
||||||
|
return "ntrans_fast";
|
||||||
|
case PTRANS_FAST:
|
||||||
|
return "ptrans_fast";
|
||||||
|
case NTRANS_HVIO:
|
||||||
|
return "ntrans_hvio";
|
||||||
|
case PTRANS_HVIO:
|
||||||
|
return "ptrans_hvio";
|
||||||
|
case POLY:
|
||||||
|
return "poly";
|
||||||
|
case POLY2:
|
||||||
|
return "poly2";
|
||||||
|
case ALU1:
|
||||||
|
return "metal";
|
||||||
|
case ALU2:
|
||||||
|
return "metal2";
|
||||||
|
case ALU3:
|
||||||
|
return "metal3";
|
||||||
|
case ALU4:
|
||||||
|
return "metal4";
|
||||||
|
case ALU5:
|
||||||
|
return "metal5";
|
||||||
|
case ALU6:
|
||||||
|
return "metal6";
|
||||||
|
case ALU7:
|
||||||
|
return "metal7";
|
||||||
|
case ALU8:
|
||||||
|
return "metal8";
|
||||||
|
case ALU9:
|
||||||
|
return "metal9";
|
||||||
|
case TALU1:
|
||||||
|
return "allowM";
|
||||||
|
case TALU2:
|
||||||
|
return "allowM2";
|
||||||
|
case TALU3:
|
||||||
|
return "allowM3";
|
||||||
|
case TALU4:
|
||||||
|
return "allowM4";
|
||||||
|
case TALU5:
|
||||||
|
return "allowM5";
|
||||||
|
case TALU6:
|
||||||
|
return "allowM6";
|
||||||
|
case TALU7:
|
||||||
|
return "allowM7";
|
||||||
|
case TALU8:
|
||||||
|
return "allowM8";
|
||||||
|
case TALU9:
|
||||||
|
return "allowM9";
|
||||||
|
case CALU1:
|
||||||
|
return "conM";
|
||||||
|
case CALU2:
|
||||||
|
return "conM2";
|
||||||
|
case CALU3:
|
||||||
|
return "conM3";
|
||||||
|
case CALU4:
|
||||||
|
return "conM4";
|
||||||
|
case CALU5:
|
||||||
|
return "conM5";
|
||||||
|
case CALU6:
|
||||||
|
return "conM6";
|
||||||
|
case CALU7:
|
||||||
|
return "conM7";
|
||||||
|
case CALU8:
|
||||||
|
return "conM8";
|
||||||
|
case CALU9:
|
||||||
|
return "conM9";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* driv_vti_p.h : header file for vti cp driver *
|
||||||
|
* *
|
||||||
|
* version : 3.00 *
|
||||||
|
* date : 07/11/91 *
|
||||||
|
* *
|
||||||
|
* Modified, rewritten and maintained by Frederic Petrot since september 1990 *
|
||||||
|
* *
|
||||||
|
*******************************************************************************/
|
||||||
|
static char *decodelayer();
|
||||||
|
static void vtigetdate();
|
||||||
|
void vtisavephfig();
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MCL_H
|
||||||
|
#define _MCL_H
|
||||||
|
#ifdef __STDC__
|
||||||
|
extern void vtiloadlofig(lofig_list *, char *, char);
|
||||||
|
extern void vtisavelofig(lofig_list *);
|
||||||
|
#else
|
||||||
|
extern void vtiloadlofig();
|
||||||
|
extern void vtisavelofig();
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Alliance CAD System
|
||||||
|
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||||
|
* Universite Pierre et Marie Curie
|
||||||
|
*
|
||||||
|
* Home page : http://www-asim.lip6.fr/alliance/
|
||||||
|
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Library General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MCP_H
|
||||||
|
#define _MCP_H
|
||||||
|
#ifdef __STDC__
|
||||||
|
extern void vtiloadphfig(phfig_list *ptfig, char *figname, char mode);
|
||||||
|
extern void vtisavephfig(phfig_list *ptfig);
|
||||||
|
#else
|
||||||
|
extern void vtiloadphfig();
|
||||||
|
extern void vtisavephfig();
|
||||||
|
#endif
|
||||||
|
#endif
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue