next up previous
Next: Testeo de las puertas Up: La biblioteca de puertas Previous: El interface gates.h

La implementación gates.c

En el fichero gates.c se implementan los métodos declarados en las clases declaradas en gates.h. Los ficheros defs.h y gates.h deben ser incluidos. Este es el contenido de gates.c:
#include <stdarg.h>
#include "defs.h"
#include "gates.h"

/* N O T */

void NOT::run (WIRE &o, WIRE &i) {
  WIRE tmp = ~i;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}


/* A N D */

void AND::run (WIRE &o, WIRE &i0, WIRE &i1) {
  WIRE tmp = i0 & i1;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

void AND::run(WIRE &out, int inputs, WIRE &in, ...) {
  va_list args;                 // Puntero a la lista de argumentos
  va_start(args,in);            // que ahora apunta al primero de ellos
  WIRE tmp = in;                // Primera entrada
  while(--inputs) {             // Para el resto de entradas
    tmp &= va_arg(args,WIRE);   // AND con la siguiente entrada
  }
  va_end(args);                 // Finalización de manipulación
  if(delay==tmp) {              // Miramos si la salida es estable
    if(tmp<127) out=GND;        // y binarizamos
    else out=VCC;
  }
  delay=tmp;                    // Recordamos la "posible salida"
}

void AND::run(WIRE &o, int inputs, WIRE i[]) {
  WIRE tmp = i[0];
  for(int j=1;j<inputs;j++) {
    tmp &= i[j];
  }
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}


/* N A N D */

void NAND::run (WIRE &o, WIRE &i0, WIRE &i1) {
  WIRE tmp = ~(i0 & i1);
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

void NAND::run(WIRE &out, int inputs, WIRE &in, ...) {
  va_list args;                 // Puntero a la lista de argumentos
  va_start(args,in);            // que ahora apunta al primero de ellos
  WIRE tmp = in;                // Primera entrada
  while(--inputs) {             // Para el resto de entradas
    tmp &= va_arg(args,WIRE);   // AND con la siguiente entrada
  }
  va_end(args);                 // Finalización de manipulación
  tmp = ~tmp;                   // Negamos la AND
  if(delay==tmp) {              // Miramos si la salida es estable
    if(tmp<127) out=GND;        // y binarizamos
    else out=VCC;
  }
  delay=tmp;                    // Recordamos la "posible salida"
}

void NAND::run(WIRE &o, int inputs, WIRE i[]) {
  WIRE tmp = i[0];
  for(int j=1;j<inputs;j++) {
    tmp &= i[j];
  }
  tmp = ~tmp;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}


/* O R */

void OR::run(WIRE &o, WIRE &i0, WIRE &i1) {
  WIRE tmp = i0 | i1;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

void OR::run(WIRE &out, int inputs, WIRE &in, ...) {
  va_list args;                 // Puntero a la lista de argumentos
  va_start(args,in);            // que ahora apunta al primero de ellos
  WIRE tmp = in;                // Primera entrada
  while(--inputs) {             // Para el resto de entradas
    tmp |= va_arg(args,WIRE);   // OR con la siguiente entrada
  }
  va_end(args);                 // Finalización de manipulación
  if(delay==tmp) {              // Miramos si la salida es estable
    if(tmp<127) out=GND;        // y binarizamos
    else out=VCC;
  }
  delay=tmp;                    // Recordamos la "posible salida"
}

void OR::run(WIRE &o, int inputs, WIRE i[]) {
  WIRE tmp = i[0];
  for(int j=1;j<inputs;j++) {
    tmp |= i[j];
  }
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}


/* N O R */

void NOR::run (WIRE &o, WIRE &i0, WIRE &i1) {
  WIRE tmp = ~(i0 | i1);
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

void NOR::run(WIRE &out, int inputs, WIRE &in, ...) {
  va_list args;                 // Puntero a la lista de argumentos
  va_start(args,in);            // que ahora apunta al primero de ellos
  WIRE tmp = in;                // Primera entrada
  while(--inputs) {             // Para el resto de entradas
    tmp |= va_arg(args,WIRE);   // OR con la siguiente entrada
  }
  va_end(args);                 // Finalización de manipulación
  tmp = ~tmp;                   // Negamos la OR
  if(delay==tmp) {              // Miramos si la salida es estable
    if(tmp<127) out=GND;        // y binarizamos
    else out=VCC;
  }
  delay=tmp;                    // Recordamos la "posible salida"
}

void NOR::run(WIRE &o, int inputs, WIRE i[]) {
  WIRE tmp = i[0];
  for(int j=1;j<inputs;j++) {
    tmp |= i[j];
  }
  tmp = ~tmp;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}


/* X O R */

void XOR::run (WIRE &o, WIRE &i0, WIRE &i1) {
  WIRE tmp = i0 ^ i1;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

void XOR::run(WIRE &out, int inputs, WIRE &in, ...) {
  va_list args;                 // Puntero a la lista de argumentos
  va_start(args,in);            // que ahora apunta al primero de ellos
  WIRE tmp = in;                // Primera entrada
  while(--inputs) {             // Para el resto de entradas
    tmp ^= va_arg(args,WIRE);   // XOR con la siguiente entrada
  }
  va_end(args);                 // Finalización de manipulación
  if(delay==tmp) {              // Miramos si la salida es estable
    if(tmp<127) out=GND;        // y binarizamos
    else out=VCC;
  }
  delay=tmp;                    // Recordamos la "posible salida"
}

void XOR::run(WIRE &o, int inputs, WIRE i[]) {
  WIRE tmp = i[0];
  for(int j=1;j<inputs;j++) {
    tmp ^= i[j];
  }
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}


/* N X O R */

void NXOR::run (WIRE &o, WIRE &i0, WIRE &i1) {
  WIRE tmp = ~(i0 ^ i1);
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

void NXOR::run(WIRE &out, int inputs, WIRE &in, ...) {
  va_list args;                 // Puntero a la lista de argumentos
  va_start(args,in);            // que ahora apunta al primero de ellos
  WIRE tmp = in;                // Primera entrada
  while(--inputs) {             // Para el resto de entradas
    tmp ^= va_arg(args,WIRE);   // XOR con la siguiente entrada
  }
  va_end(args);                 // Finalización de manipulación
  tmp = ~tmp;                   // Negamos la XOR
  if(delay==tmp) {              // Miramos si la salida es estable
    if(tmp<127) out=GND;        // y binarizamos
    else out=VCC;
  }
  delay=tmp;                    // Recordamos la "posible salida"
}

void NXOR::run(WIRE &o, int inputs, WIRE i[]) {
  WIRE tmp = i[0];
  for(int j=1;j<inputs;j++) {
    tmp ^= i[j];
  }
  tmp = ~tmp;
  if(delay==tmp) o=tmp;
  delay=tmp;
  if(o<127) o=GND; else o=VCC;
}

/* B U F F E R _ Z */

BUFFER_Z::BUFFER_Z() {
  sample=0;
}

void BUFFER_Z::run(WIRE &o, WIRE &i, WIRE &e) {
  delay[sample] = i;
  sample = (sample+1) % 2;
  if(delay[0]!=delay[1]) return;
  if(e==VCC) o=delay[0];
}

En este fichero se construyen los métodos declarados en las clases. Para describir el método X de la clase Y, en C++ usamos la notación Y::X.



Vicente González Ruiz 2001-10-15