00001
00002
00003
00004
00005
00006
00007
00008 #ifndef GENERICBINARYINPUTSYNAPSE_H_
00009 #define GENERICBINARYINPUTSYNAPSE_H_
00010
00011
00012 #include "globals.h"
00013 #include "SimContext.h"
00014
00015
00016 template<class BaseSyn>
00017 class GenericBinaryInputSynapse : public BaseSyn {
00018
00019 public:
00020 GenericBinaryInputSynapse(float psr_level_hi = 5,
00021 float psr_level_lo = 0,
00022 bool isActive = true) {
00023 this->psr_level_hi = psr_level_hi;
00024 this->psr_level_lo = psr_level_lo;
00025 this->isActive = isActive;
00026 }
00027
00028 float psr_level_hi;
00029
00030 float psr_level_lo;
00031
00032 bool isActive;
00033
00034 virtual ~GenericBinaryInputSynapse() {}
00035
00036 virtual void reset(SimContext &sim_ctxt);
00037
00038 virtual void eventHit(SimContext & sim_ctxt, Time time, port_id_t port);
00039
00040 protected:
00041 enum { lvl_hi, lvl_lo } last_level;
00042
00043 };
00044
00045 template<class BaseSyn>
00046 void GenericBinaryInputSynapse<BaseSyn>::eventHit(SimContext & sim_ctxt, Time time, port_id_t port)
00047 {
00048 if (port == 0) {
00049 last_level = lvl_lo;
00050 if (isActive) {
00051 BaseSyn::updatePSR(psr_level_lo, time);
00052 }
00053 }
00054 else if (port == 1) {
00055 last_level = lvl_hi;
00056 if (isActive) {
00057 BaseSyn::updatePSR(psr_level_hi, time);
00058 }
00059 }
00060 else if (port == 2) {
00061 if (!isActive) {
00062 BaseSyn::updatePSR((last_level == lvl_hi) ? psr_level_hi : psr_level_lo, time);
00063 isActive = true;
00064 }
00065
00066 }
00067 else if (port == 3) {
00068 if (isActive) {
00069 BaseSyn::updatePSR(0, time);
00070 isActive = false;
00071 }
00072 }
00073 else if (port == 4) {
00074 if (isActive) {
00075 isActive = false;
00076 BaseSyn::updatePSR(0, time);
00077 }
00078 else {
00079 isActive = true;
00080 BaseSyn::updatePSR((last_level == lvl_hi) ? psr_level_hi : psr_level_lo, time);
00081 }
00082 }
00083 }
00084
00085
00086 template<class BaseSyn>
00087 void GenericBinaryInputSynapse<BaseSyn>::reset(SimContext &sim_ctxt)
00088 {
00089 BaseSyn::resetPSRs();
00090 }
00091
00092 #endif