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