#include <stdio.h>

int decvbe();
int puiss();
char valeur();

main()
{
 int i;
 

 i= decvb(8,1);
}

int decvb(l,c)
int l,c;
{
 FILE *fich;
 int i,j,k;
 char name[12];

 name[0] = 'd';
 name[1] = 'e';
 name[2] = 'c';
 name[3] = '_';
 name[4] = valeur(l);
 name[5] = '_';
 name[6] = valeur(c);
 name[7] = '.';
 name[8] = 'v';
 name[9] = 'b';
 name[10] = 'e';
 name[11] = '\0';
 
 fich = fopen(name, "w");
 fprintf(fich,"ENTITY  decod_%d_%d IS\n",l,c);

 fprintf(fich,"PORT (\n"); 
 fprintf(fich,"   adr	:	IN BIT_VECTOR(%d DOWNTO 0);\n",l+c-1);
 fprintf(fich,"   wl	:	OUT BIT_VECTOR(0 TO %d);\n",puiss(l)-1);
 fprintf(fich,"   sel	:   	OUT BIT_VECTOR(0 TO %d);\n",puiss(c)-1);
 fprintf(fich,"   write :	IN BIT ;\n");
 fprintf(fich,"   wrt	:	OUT BIT ;\n");
 fprintf(fich,"   rd	:	OUT BIT ;\n");
 fprintf(fich,"   ck	:   	IN BIT ;\n");
 fprintf(fich,"   vdd	:   	IN BIT ;\n");
 fprintf(fich,"   vss	:   	IN BIT) ;\n");
 fprintf(fich,"END decod_%d_%d ;\n",l,c);
 fprintf(fich,"\n\n\n"); 
 fprintf(fich,"ARCHITECTURE decarch OF decod_%d_%d IS \n",l,c);
 for(i=0;i<l-3;i++)
 {
  fprintf(fich," signal wl%d : BIT_VECTOR(0 TO %d);\n",i,puiss(4+i)-1);
 }
 for(i=0;i<c;i++)
 {
  fprintf(fich," signal sl%d : BIT_VECTOR(0 TO %d);\n",i,puiss(i+1)-1);
 }

 fprintf(fich,"\n\n\n");
 fprintf(fich,"begin\n");
 fprintf(fich,"--  word-line calculations --\n\n\n");

 fprintf(fich,"  with adr(%d DOWNTO %d) select\n",c+3,c);
 fprintf(fich,"  wl0 <= B\"0000000000000001\" when B\"0000\",\n");
 for(i=1;i<16;i++)
 {
  fprintf(fich,"         B\"");
  for(j=0;j<15-i;j++)
  {
   fprintf(fich,"0");
  }
   fprintf(fich,"1");
  for(j=16-i;j<16;j++)
  {
   fprintf(fich,"0");
  }
  fprintf(fich,"\" when B\"");
  j=i;
  for(k=3;k>=0;k--)
  {
   if(j>=puiss(k)) {
                    fprintf(fich,"1");
                    j = j - puiss(k);
                   }
   else fprintf(fich,"0");
  }
  if(i==15) fprintf(fich,"\";\n");
  else fprintf(fich,"\" ,\n");
 }
 fprintf(fich,"\n\n\n");

 for(i=4;i<l;i++)
 {
  fprintf(fich,"  with adr(%d) select\n",c+i);
  fprintf(fich,"  wl%d <= wl%d(0 TO %d) & X\"",i-3,i-4,puiss(i)-1);
  for(j=0;j<puiss(i-2);j++)
  {
   fprintf(fich,"0");
  }
  fprintf(fich,"\" when '0',\n");
  fprintf(fich,"         X\"");
  for(j=0;j<puiss(i-2);j++)
  {
   fprintf(fich,"0");
  }
  fprintf(fich,"\" & wl%d(0 TO %d) when '1';\n",i-4,puiss(i)-1);
  fprintf(fich,"\n");
 } 

 fprintf(fich,"\n");
 fprintf(fich,"  wl <= wl%d ; \n",l-4);
 fprintf(fich,"\n\n\n");
 fprintf(fich,"--  sel-lines calculation --\n\n\n");

 fprintf(fich,"  with adr(0) select\n");
 fprintf(fich,"  sl0 <= B\"01\" when '0',\n");
 fprintf(fich,"         B\"10\" when '1';\n");
 fprintf(fich,"\n");

 for(i=1;i<c;i++)
 {
  fprintf(fich,"  with adr(%d) select\n",i);
  fprintf(fich,"  sl%d <= sl%d(0 TO %d) & B\"",i,i-1,puiss(i)-1);
  for(j=0;j<puiss(i);j++)
  {
   fprintf(fich,"0");
  }
  fprintf(fich,"\" when '0',\n");
  fprintf(fich,"         B\"");
  for(j=0;j<puiss(i);j++)
  {
   fprintf(fich,"0");
  }
  fprintf(fich,"\" & sl%d(0 TO %d) when '1';\n",i-1,puiss(i)-1);
  fprintf(fich,"\n");
 } 

 fprintf(fich,"   sel <= sl%d;\n\n",c-1);

 fprintf(fich,"   wrt <= not(ck) and write ;\n");
 fprintf(fich,"   rd  <= not(ck) and not(write) ;\n\n\n");

 fprintf(fich," END decarch ;\n");
}

int puiss(i)
int i;
{
 if(i==0) return(1);
 else return(2*puiss(i-1));
}
 
char valeur(i)
int i;
{
 switch(i)
 {
  case 1:{ return('1'); break;}
  case 2:{ return('2'); break;}
  case 3:{ return('3'); break;}
  case 4:{ return('4'); break;}
  case 5:{ return('5'); break;}
  case 6:{ return('6'); break;}
  case 7:{ return('7'); break;}
  case 8:{ return('8'); break;}
  default: break;
 }
}

