#include "defs.h" xprod(sig, c) SIG sig; REG TAG c; { STRING sn, pn; INT pin = -1; TAG is, s, tp, p; INT onesig; INT names; sn=sig->s_tag->tc; s=is=find(sn, *EXTSIG(sn)); if(s==nil(TAG)) { errmsg(sn, "signal not found\n"); return; } if(c==nil(TAG)) { errmsg(sn, "no chip for signal\n"); return; } if(sig->s_pinnum) { pin=sig->s_pinnum; } if(sig->s_pinnam == nil(TAG)) { names=0; tp=nil(TAG); } else{ p=tp=find(pn=sig->s_pinnam->tc, *CHEAT(TAG*,c_type->val)); if(p==nil(TAG)) { errmsg(pn, "pin not found\n"); return; } names=1; } onesig=s->nxt==nil(TAG); while(c!=nil(TAG)) { if(lslflg==0){ outchp(c); prc(NL); } p=tp; if(s==nil(TAG)) { s=is; } /* loop over pins attaching signals */ if(names) { while( (s!=nil(TAG)) && (p!=nil(TAG))) { if( (pin>0) && (pin!=CHEAT(INT,p->val)) ) { errmsg(p->tc, "bad pin number\n"); } if(lslflg) outchp(c); tab(); prL(follow(s)); if(vpflg) { tab(); prs(p->tc); } tab(); prn(p->val); p=p->nxt; prc(NL); if(onesig==0) { s=s->nxt; } } } else{ if(lslflg) outchp(c); tab(); prL(follow(s)); tab(); prn(pin); prc(NL); if(onesig==0) s=s->nxt; } if(p!=nil(TAG)) break; c=c->nxt; } if( ( (c==nil(TAG)) ^ (onesig || s==nil(TAG)) ) || (p!=nil(TAG))) { errmsg(sn, pn); msg(", conformability error\n"); return; } } prq(s) STRING s; { if(any('/', s)==0) { prs(current+1); } prs(s); } prL(t) TAG t; { STRING s=t->tc; if(any('/',s)==0) { REG STRING cs=current; REG INT n=t->lev; CHAR c; while(*cs && (n>0)) { if(*cs++=='/') n--; } c = *cs; *cs=0; prs(current+1); *cs=c; } prs(s); } outchp(c) TAG c; { if(equstr(c_type->tc, "<>")) { prs(".o "); prq(c->tc); } else { if(lslflg) prs(".l "); else prs(".c\t"); prq(c->tc); if(lslflg) prc(' '); else prc('\t'); prs(c_type->tc); } }