next up previous
Next: test_muxs.c Up: Práctica 6. Multiplexores y Previous: muxs.h

muxs.c

/*
 * muxs.c -- Multiplexores y desmultiplexores.
 * Ultima modificación: 19-10-2000.
 * gse.
 */

#include "defs.h"
#include "gates.h"
#include "decods.h"
#include "muxs.h"

void MUX_2_1::run(WIRE in[2], WIRE &sel, WIRE &out) {
  not.run(nsel,sel);
  buf[0].run(out,in[0],nsel);
  buf[1].run(out,in[1],sel);
}

void DEMUX_1_2::run(WIRE &in, WIRE &sel, WIRE out[2]) {
  not.run(nsel,sel);
  and[0].run(out[0],nsel,in);
  and[1].run(out[1],sel,in);
}

void MUX_4_1::run(WIRE in[4], WIRE sel[2], WIRE &out) {
  dec.run(sel,d);
  for(int i=0;i<4;i++)
    buf[i].run(out,in[i],d[i]);
}

void DEMUX_1_4::run(WIRE &in, WIRE sel[2], WIRE out[4]) {
  dec.run(sel,d);
  for(int i=0;i<4;i++)
    and[i].run(out[i],d[i],in);
}

void MUX::create(int num_sels) {
  decoder.create(num_sels);
  num_ins = 1<<num_sels;
  buffers = new BUFFER_Z[num_ins];
  outs_decoder = new WIRE[num_ins];
}
void MUX::destroy() {
  decoder.destroy();
  delete buffers;
  delete outs_decoder;
}
void MUX::run(WIRE in[], WIRE sel[], WIRE &out) {
  decoder.run(sel,outs_decoder);
  for(int i=0; i<num_ins; i++) {
    buffers[i].run(out,in[i],outs_decoder[i]);
  }
}

DEMUX::DEMUX() {}
void DEMUX::create(int num_sels) {
  decoder.create(num_sels);
  num_outs = 1<< num_sels;
  and = new AND[num_outs];
  out_decoder = new WIRE[num_outs];
}
void DEMUX::destroy() {
  decoder.destroy();
  delete and;
  delete out_decoder;
}
DEMUX::DEMUX(int num_sels) {
  create(num_sels);
}
void DEMUX::run(WIRE &in, WIRE sel[], WIRE out[]) {
  decoder.run(sel,out_decoder);
  for(int i=0;i<num_outs;i++)
    and[i].run(out[i],out_decoder[i],in);
}




2000-10-23