00001 00024 #ifndef _LOGIC_FUNCTIONS_H_ 00025 #define _LOGIC_FUNCTIONS_H_ 00026 00027 #include <functional> 00028 #include <string> 00029 00030 #include "logicDefs.h" 00031 00036 struct LogicFunc { 00037 virtual const std::string toString () const = 0; 00038 }; 00039 00046 struct OneInputFunc: public LogicFunc { 00047 virtual LogicVal operator () (const LogicVal& in) const = 0; 00048 }; 00049 00054 struct TwoInputFunc: public LogicFunc { 00055 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const = 0; 00056 }; 00057 00061 struct BUF : public OneInputFunc, public std::unary_function<LogicVal, LogicVal> { 00062 LogicVal _buf_ (const LogicVal& in) const { 00063 return in; 00064 } 00065 00066 virtual LogicVal operator () (const LogicVal& in) const { 00067 return _buf_ (in); 00068 } 00069 00070 virtual const std::string toString () const { return "BUF"; } 00071 }; 00072 00076 struct INV : public OneInputFunc, public std::unary_function<LogicVal, LogicVal> { 00077 LogicVal _not_ (const LogicVal& in) const { 00078 if (in == '0') { 00079 return '1'; 00080 } else if (in == '1') { 00081 return '0'; 00082 } else { 00083 return _X; 00084 } 00085 } 00086 00087 virtual LogicVal operator () (const LogicVal& in) const { 00088 return _not_ (in); 00089 } 00090 00091 virtual const std::string toString () const { return "INV"; } 00092 }; 00093 00094 00099 struct AND2: public TwoInputFunc, public std::binary_function<LogicVal, LogicVal, LogicVal> { 00100 LogicVal _and_ (const LogicVal& x, const LogicVal& y) const { 00101 if (x == '0' || y == '0') { 00102 return '0'; 00103 00104 } else if (x == '1' ) { 00105 return y; 00106 00107 } else if (y == '1') { 00108 return x; 00109 00110 } else { 00111 return _X; 00112 } 00113 00114 } 00115 00116 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const { 00117 return _and_ (x, y); 00118 } 00119 00120 virtual const std::string toString () const { return "AND2"; } 00121 }; 00122 00126 struct NAND2: public AND2 { 00127 LogicVal _nand_ (const LogicVal& x, const LogicVal& y) const { 00128 return INV()._not_ (AND2::_and_ (x, y)); 00129 } 00130 00131 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const { 00132 return _nand_ (x, y); 00133 } 00134 00135 virtual const std::string toString () const { return "NAND2"; } 00136 }; 00137 00141 struct OR2: public TwoInputFunc, public std::binary_function<LogicVal, LogicVal, LogicVal> { 00142 LogicVal _or_ (const LogicVal& x, const LogicVal& y) const { 00143 if (x == '1' || y == '1') { 00144 return '1'; 00145 } else if (x == '0') { 00146 return y; 00147 } else if (y == '0') { 00148 return x; 00149 } else { 00150 return _X; 00151 } 00152 } 00153 00154 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const { 00155 return _or_ (x, y); 00156 } 00157 00158 virtual const std::string toString () const { return "OR2"; } 00159 }; 00160 00164 struct NOR2: public OR2 { 00165 LogicVal _nor_ (const LogicVal& x, const LogicVal& y) const { 00166 return INV()._not_ (OR2::_or_ (x, y)); 00167 } 00168 00169 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const { 00170 return _nor_ (x, y); 00171 } 00172 00173 virtual const std::string toString () const { return "NOR2"; } 00174 }; 00175 00179 struct XOR2: public TwoInputFunc, public std::binary_function<LogicVal, LogicVal, LogicVal> { 00180 LogicVal _xor_ (const LogicVal& x, const LogicVal& y) const { 00181 if (x == _X || y == _X) { 00182 return _X; 00183 } else if (INV()._not_(x) == y) { 00184 return '1'; 00185 } else if (x == y) { 00186 return '0'; 00187 } else { 00188 return 'X'; 00189 } 00190 } 00191 00192 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const { 00193 return _xor_ (x, y); 00194 } 00195 00196 virtual const std::string toString () const { return "XOR2"; } 00197 }; 00198 00202 struct XNOR2: public XOR2 { 00203 LogicVal _xnor_ (const LogicVal& x, const LogicVal& y) const { 00204 return INV()._not_ (XOR2::_xor_ (x, y) ); 00205 } 00206 00207 virtual LogicVal operator () (const LogicVal& x, const LogicVal& y) const { 00208 return _xnor_ (x, y); 00209 } 00210 00211 virtual const std::string toString () const { return "XNOR2"; } 00212 }; 00213 00214 #endif