⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readpla.cpp

📁 Quine-McCluskey Method
💻 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 + -