#include <stdio.h> #include <stdlib.h> #include <stl.h> #include "parser.h" #define BUFLEN 16384 int parse_placement(char *file, vector<net> &vn, vector<pin> &vp, int &width, int &height) { FILE *fp; char buf[BUFLEN]; char *cret,*cptr; int iret; int lcount=0; int num_nets; int i,tx,ty; fp=fopen(file,"r"); if (fp==NULL) { fprintf(stderr,"parse_placement: couldn't open file:%s\n",file); return -1; } // we assume that the first line is "<width> <height>" cret=fgets(buf,BUFLEN,fp); if (cret==NULL || strlen(cret)>(BUFLEN-2)) { fprintf(stderr,"parse_placement: invalid height/width line: %s\n",buf); return -1; } width=strtol(buf,&cptr,10); if (buf==cptr) { fprintf(stderr,"parse_placement: invalid height/width line: %s\n",buf); return -1; } height=strtol(cptr,&cret,10); if (cret==cptr) { fprintf(stderr,"parse_placement: invalid height/width line: %s\n",buf); return -1; } // now we read in the ned lines one at a time for (lcount=2,fgets(buf,BUFLEN,fp);!feof(fp);fgets(buf,BUFLEN,fp),lcount++) { if (buf[0]=='#') continue; if (strlen(buf)>(BUFLEN-2)) { fprintf(stderr,"%s:%i line too long!\n",file,lcount); vn.clear(); vp.clear(); return -1; } net n; n.id=strtol(buf,&cret,10); if (buf==cret) { fprintf(stderr,"%s:%i invalid net ID\n",file,lcount); vn.clear(); vp.clear(); return -1; } cptr=cret; num_nets=strtol(cptr,&cret,10); if (cret==cptr) { fprintf(stderr,"%s:%i invalid net ID\n",file,lcount); vn.clear(); vp.clear(); return -1; } cptr=cret; for (i=0;i<num_nets;i++) { pin p; p.x=strtol(cptr,&cret,10); if (cptr==cret) { fprintf(stderr,"%s:%i invalid pin xpos\n",file,lcount); vn.clear(); vp.clear(); return -1; } cptr=cret; p.y=strtol(cptr,&cret,10); if (cptr==cret) { fprintf(stderr,"%s:%i invalid pin ypos\n",file,lcount); vn.clear(); vp.clear(); return -1; } cptr=cret; if (p.x==0 || p.x==(width-1) || p.y==0 || p.y==(height-1)) p.pad=true; else p.pad=false; p.net=n.id; if (p.x<0 || p.x>=width || p.y<0 || p.y>=height) { fprintf(stderr,"%s:%i (%i,%i) pin outside grid area\n", file,lcount,p.x,p.y); vn.clear(); vp.clear(); return -1; } n.pins.push_back(p); vp.push_back(p); } vn.push_back(n); } return 0; }