#include <stdio.h>

// Modello comportamentale a livello logico in C di una rete combinatoria
// instrumentato per iniezione guasti stuck-at
//             ---
// Struttura equivalente al modello di cui sotto
// i1|---l0---|   |
//            |AND|---l4---|
// i2|---l1---|   |        |       ----
//             ---         |------|    |
//                                |    |
//             ---         |------| OR |---l7---|o1
// i3|---l2---|   |        |      |    |
//            |AND|---l5---|  |---|    |
// i4|---l3---|   |           |    ----
//             ---            |
//                            |
// i5|---l6-------------------|
//
// i1-i5 : ingressi della rete
// l0-l7 : linee della rete
// o1 : uscita della rete
//
// fault e line : indicano che tipo di stuck_at iniettare su una data linea
// es. fault=1 e line=4 -> stuck at 1 sulla linea 4
// valori fuori range == rete sana
//
int retecomb(int i1, int i2, int i3, int i4, int i5, int fault, int line)
{
  int l0, l1, l2, l3, l4, l5, l6, l7;
  int o1;

  // Matrice per l'iniezione di guasto
  int sa[2][8]={{0,0,0,0,0,0,0,0},{1,1,1,1,1,1,1,1}};

  // Scelta del guasto
  if ((fault>-1)&&(fault<2)&&(line>-1)&&(line<8))
  {
    fault=!fault;
    sa[fault][line]=!sa[fault][line];
  }
  
  // Modello instrumentato
  l0=(i1|sa[0][0])&sa[1][0];
  l1=(i2|sa[0][1])&sa[1][1];
  l2=(i3|sa[0][2])&sa[1][2];
  l3=(i4|sa[0][3])&sa[1][3];
  l6=(i5|sa[0][6])&sa[1][6];
  
  l4=l0&l1;
  l4=(l4|sa[0][4])&sa[1][4];

  l5=l2&l3;
  l5=(l5|sa[0][5])&sa[1][5];
  
  l7=l4|l5|l6;
  o1=(l7|sa[0][7])&sa[1][7];
  
  return o1;
}

/////////////////////////////////////////////
//Obiettivo: calcolare il numero di vettori di test per i vari guasti stuck at
// Codice instrumentato per il profiling

int main()
{

  // Ingressi
  int i1=0,i2=0,i3=0,i4=0,i5=0;
  // Guasto
  int f=-1,l=-1;
  // Contatore
  int cont=0;

  // Per tutti i possibili guasti stuck at
  for(f=0;f<2;f++)
    for(l=0;l<8;l++)
    {

      cont=0;

      // Per ogni guasto iniettato provo tutti i possibili ingressi
      for(i1=0;i1<2;i1++)  
        for(i2=0;i2<2;i2++)  
          for(i3=0;i3<2;i3++)  
            for(i4=0;i4<2;i4++)  
              for(i5=0;i5<2;i5++)
                if (retecomb(i1,i2,i3,i4,i5,f,l)!=retecomb(i1,i2,i3,i4,i5,-1,-1)) cont++;
      printf("Guasto stuck-at-%d sulla linea%d: %d vettori di test\n", f,l,cont);
    }                       
}
