/*
 * user.h -- Biblioteca de m'oodulos definidos por el usuario.
 * 'Ultima modificaci'on: 03-03-2002
 *
 * Antonio G'omez Muriana (correo@senco.net)
 * Miguel Montero G'amez
 */

/*
 * Cerrojo D con entrada de habilitaci'on
 * 
 *           na0    na2                  E D | Q Qn
 *  D --+---NAND----NAND-+-- Q          -----+------
 *      |   |    a    \ /                0 0 | Q Qn
 *  E ------+          X                 0 1 | Q Qn
 *      | n |    b    / \                1 0 | 0 1
 *     NOT--NAND----NAND-+-- Qn          1 1 | 1 0
 *      no   na1   na3
 */

class D_LATCH_ENABLE {
	NAND na0, na1, na2, na3;
 	WIRE a, b, n;
	NOT no;
	
public:
	void run(WIRE &D, WIRE &E, WIRE &Q, WIRE &Qn);
};

/*
 * Un registro de 48 bits con entrada de habilitaci'on contruido
 * con 48 flip-flops D. La l'inea EN permite escribir el contenido del
 * bus de entrada i[] en los registros. 
 */

class REG_48_EN {
	D_LATCH_ENABLE dl[48];
	WIRE Qn[48];
	
public:
	void run(WIRE &EN, WIRE i[48], WIRE o[48]);
};


/*
 * Celda básica del contador síncrono binario ascendente con entrada de datos
 *
 * Un contador binario síncrono ascendente con entrada de datos puede ser
 * construido como un array de celdas básicas como la que a continuación es
 * presentada.
 *
 *      +----+
 *  a --|AND |
 *  b --|    |-+        +-------------- c
 *  m +O|and3| |        |           +-- d
 *    | +----+ |        |           |
 *    | +----+ | +--+   |   +-----+ |
 *    +-|AND | +-|OR|---+---|J    |-+
 *  e---|and2|---|or| +-|--O|> ff |---- ck
 *      +----+   +--+ | +-X-|K    |O
 * ck ----------------+   | +-----+ 
 *                        m
 */

class BC_SU_INB_COUNTER {
	NEG_JK_FF ff;
	NOT n;
	AND and3, and2;
	OR or;
	XOR xor;
	WIRE Qn,mn,me,abm,cxk;
	
public:
	void run(WIRE &ck, WIRE &m, WIRE &a, WIRE &b, WIRE &c, WIRE &d, WIRE &e);
};


/*
 * Contador síncrono ascendente de 5 bits con entrada y cero.
 *
 *      E0   Q0   E1   Q1   E2   Q2   E3   Q3   E4    Q4
 *       |    |    |    |    |    |    |    |    |     |
 *    +-----+ | +-----+ | +-----+ | +-----+ | +-----+  |
 * 1 -|a e c|-|-|a e c|-|-|a e c|-|-|a e c|-|-|a e c|- |
 * 1 -|b   d|-+-|b   d|-+-|b   d|-+-|b   d|-+-|b   d|--+
 *    +-----+   +-----+   +-----+   +-----+   +-----+
 *       |         |         |         |         |
 * ck/m -+---------+---------+---------+---------+
 *
 */

class SENCOUNTER5 {
	BC_SU_INB_COUNTER c[5];
	WIRE a[5];					// Conecta las líneas "c" del BC_SD_BIN_COUNTER
								// El resto de líneas son de entrada o de salida
public:
	void run(WIRE &ck, WIRE &m, WIRE Q[5], WIRE E[5]);
};
