#ifndef miscH
#define miscH

#include <list>
#include <vector>
#include <fstream>
#include <iostream>
#include <time.h>
#include <stdexcept>

#include "util.h"
#include "cudd.h"
#include "cuddInt.h"
#include "UMStr.h"

// typy vyskytujicich se elementu (vstup, vystup nebo hradlo)
#define T_INPUT     0
#define T_OUTPUT    1
#define T_AND       2
#define T_NAND      3
#define T_OR        4
#define T_NOR       5
#define T_XOR       6
#define T_XNOR      7
#define T_NOT       8
#define T_BUF       9

using namespace std;

// struktura popisujici jeden element ze vstupniho souboru
// -------------------------------------------------------
struct Input_elem {
    MStr name;// jmeno elementu (jmeno vstupni nebo vystupni promenne nebo hradla)
    int type;// typ elementu (vstup, vystup, hradlo)
    list<MStr> in_vars;// seznam vstupnich promennych - tyka se jenom hradel

    // pretizeny operator pro lexikograficke serazeni podle jmena elementu - jen kvuli mvsisu
    int operator<(const Input_elem&) const;
//     int operator==(const Input_elem&) const;
};

// struktura popisujici jeden uzel v BDD
// -------------------------------------
struct Bdd_elem {
    MStr gate;
    DdNode * node;
    int type;
};

// trida popisujici jeden uzel minimalizacniho ternarniho stromu
// -----------------------------------------------------------------
class I_buffer {
public:
    I_buffer *one;
    I_buffer *zero;
    I_buffer *dc;

    I_buffer(){ one = zero = dc = NULL; /*cout << "construct" << endl;*/ };
    ~I_buffer(){ 
        if (one) 
            delete one;  
        if (zero) 
            delete zero; 
        if (dc) 
            delete dc; /*cout << "destruct" << endl; */
        one = zero = dc = NULL;
    };
    bool is_leaf(void) { if (one == NULL && zero == NULL && dc == NULL) return true; return false;}
};


#endif
