📄 readpla.cpp
字号:
#include "pla.h"main(int argc, char *argv[]){ FILE *fp; pPla func; int i; cublist *cnode,*dnode; fp=NULL; if (argc!=2) // unmatched argument numbers printf("Usage: qm input_file\n"); else if ((fp=fopen(argv[1],"r"))==NULL) // open file failed printf("File open error!!\n"); else if ((func=readpla(fp))==NULL) // read input file failed printf("Read PLA file failed!!\n"); else { /* perform your function */ qm(func); print_pla(func); /* free the used memory */ cnode=func->primes; while (cnode) { dnode=cnode; cnode=cnode->next; delete dnode->cube; delete dnode; } cnode=func->onset; while (cnode) { dnode=cnode; cnode=cnode->next; delete dnode->cube; delete dnode; } cnode=func->dcset; while (cnode) { dnode=cnode; cnode=cnode->next; delete dnode->cube; delete dnode; } delete func; } if (fp) fclose(fp); return 0;}pPla readpla(FILE *fp){ int i,j,k,tmp,tmp1,stleng,litmp; int *litarr; set itemp,*readin; pset *ctemp; pPla ptemp; char temp[256]; cublist *newnode,*onend, *dcend; ptemp=new Pla; ptemp->inputs=0; ptemp->wsize=1; ptemp->cubes=0; ptemp->primes=NULL; ptemp->onno=0; ptemp->onset=NULL; ptemp->dcno=0; ptemp->dcset=NULL; onend=NULL; dcend=NULL; readin=NULL; /* readin option */ while ((fgets(temp,256,fp))!=NULL) { stleng=strlen(temp); for (i=0;i<stleng;i++) if (temp[i]!=' ') break; // skip space if (temp[i]=='\n') continue; if (temp[i]!='.') { // wrong format printf("Format Error!!\n"); delete ptemp; delete readin; return NULL; } else if (temp[i+1]=='i' || temp[i+1]=='I') { // input no if (temp[i+2]!=' ') continue; for (i+=2;i<stleng;i++) if (temp[i]!=' ') break; // skip space ptemp->inputs=atoi(temp+i); ptemp->wsize=(ptemp->inputs)*2/BPI+1; readin=new set[ptemp->wsize]; } else if (temp[i+1]=='m' || temp[i+1]=='M') { // minterms fgets(temp,256,fp); stleng=strlen(temp); i=0; while (i < stleng && temp[i] != '\n') { for (;i<stleng;i++) if (temp[i]!=' ') break; // skip space if (temp[i] >= '0' && temp[i] <= '9') { tmp=atoi(temp+i); /* translate minterm number into cube format */ for (j=0;j<(ptemp->wsize);j++) readin[j]=0; for (j=(ptemp->inputs-1),k=1;j>=0;j--,k*=2) { tmp1 = tmp&k; if (tmp1 == 0) itemp=ZERO; else itemp=ONE; itemp = itemp << ((2*j)%BPI); readin[(2*j)/BPI] = readin[(2*j)/BPI] | itemp; } /* save minterm cubes into link list */ newnode=new cublist; newnode->cube=new set[ptemp->wsize]; newnode->mark=0; newnode->next=NULL; for (j=0;j<(ptemp->wsize);j++) newnode->cube[j]=readin[j]; if (onend==NULL) ptemp->onset=newnode; else onend->next=newnode; onend=newnode; (ptemp->onno)++; } for (;i<stleng;i++) if (temp[i]==' ' || temp[i]=='\n') break; } } else if (temp[i+1]=='d' || temp[i+1]=='D') { // don't care terms fgets(temp,256,fp); stleng=strlen(temp); i=0; while (i < stleng && temp[i] != '\n') { for (;i<stleng;i++) if (temp[i]!=' ') break; // skip space if (temp[i] >= '0' && temp[i] <= '9') { tmp=atoi(temp+i); /* translate dc number into cube format */ for (j=0;j<(ptemp->wsize);j++) readin[j]=0; for (j=(ptemp->inputs-1),k=1;j>=0;j--,k*=2) { tmp1 = tmp&k; if (tmp1 == 0) itemp=ZERO; else itemp=ONE; itemp = itemp << ((2*j)%BPI); readin[(2*j)/BPI] = readin[(2*j)/BPI] | itemp; } /* save dc cubes into link list */ newnode=new cublist; newnode->cube=new set[ptemp->wsize]; newnode->mark=0; newnode->next=NULL; for (j=0;j<(ptemp->wsize);j++) newnode->cube[j]=readin[j]; if (dcend==NULL) ptemp->dcset=newnode; else dcend->next=newnode; dcend=newnode; (ptemp->dcno)++; } for (;i<stleng;i++) if (temp[i]==' ' || temp[i]=='\n') break; } } else if (temp[i+1]=='p' || temp[i+1]=='P') // product terms break; else { // unknown options printf("Unknown Options!!\n"); delete ptemp; delete readin; return NULL; } } delete readin; if (feof(fp)) return ptemp; else return NULL;}void print_pla(pPla func){ int i; cublist *cnode; if (!func) return; printf("\n.i %d\n",func->inputs); printf(".m\n"); cnode=func->onset; while (cnode) { printf("%d ",cube_to_num(func->inputs,cnode->cube)); cnode=cnode->next; } printf("\n"); printf(".d\n"); cnode=func->dcset; while (cnode) { printf("%d ",cube_to_num(func->inputs,cnode->cube)); cnode=cnode->next; } printf("\n"); printf(".p %d\n",func->cubes); cnode=func->primes; while (cnode) { print_cube(func->inputs,cnode->cube); cnode=cnode->next; } printf(".end\n");}int cube_to_num(int inputs, pset cube){ int i,ans,shift; set result; if (!cube) return -1; ans=0; shift=1; for (i=0;i<inputs;i++) { result = (cube[(2*i)/BPI] >> ((2*i)%BPI)) & 3; if (result==ONE) ans += (shift<<(inputs-i-1)); } return ans;}void print_cube(int inputs, pset cube){ int i; set result; if (!cube) return; for (i=0;i<inputs;i++) { result = (cube[(2*i)/BPI] >> ((2*i)%BPI)) & 3; if (result==ZERO) printf("0"); else if (result==ONE) printf("1"); else if (result==DASH) printf("-"); } printf("\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -