/*$Id: bm_sffm.cc,v 26.14 2007/02/07 09:06:48 al Exp $ -*- C++ -*- * Copyright (C) 2001 Albert Davis * Author: Albert Davis * * This file is part of "Gnucap", the Gnu Circuit Analysis Package * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. *------------------------------------------------------------------ * SPICE compatible SFFM */ //testing=script 2005.10.07 #include "l_dispatcher.h" #include "bm.h" extern DISPATCHER bm_dispatcher; /*--------------------------------------------------------------------------*/ namespace { /*--------------------------------------------------------------------------*/ const double _default_offset (0); const double _default_amplitude (1); const double _default_carrier (NOT_INPUT); const double _default_modindex (NOT_INPUT); const double _default_signal (NOT_INPUT); /*--------------------------------------------------------------------------*/ class EVAL_BM_SFFM : public EVAL_BM_ACTION_BASE { private: PARAMETER _offset; PARAMETER _amplitude; PARAMETER _carrier; PARAMETER _modindex; PARAMETER _signal; PARAMETER _end; explicit EVAL_BM_SFFM(const EVAL_BM_SFFM& p); public: explicit EVAL_BM_SFFM(int c=0); ~EVAL_BM_SFFM() {} private: // override vitrual bool operator==(const COMMON_COMPONENT&)const; COMMON_COMPONENT* clone()const {return new EVAL_BM_SFFM(*this);} //void parse(CS&); //COMPONENT_COMMON void print(OMSTREAM&, LANGUAGE)const; void elabo3(const COMPONENT*); //COMMON_COMPONENT* deflate(); //COMPONENT_COMMON/nothing void tr_eval(ELEMENT*)const; //void ac_eval(ELEMENT*)const; //EVAL_BM_ACTION_BASE //bool has_tr_eval()const; //EVAL_BM_BASE/true //bool has_ac_eval()const; //EVAL_BM_BASE/true const char* name()const {return "SFFM";} bool ac_too()const {return false;} bool parse_numlist(CS&); bool parse_params(CS&); }; /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ EVAL_BM_SFFM::EVAL_BM_SFFM(int c) :EVAL_BM_ACTION_BASE(c), _offset(_default_offset), _amplitude(_default_amplitude), _carrier(_default_carrier), _modindex(_default_modindex), _signal(_default_signal), _end(NOT_VALID) { } /*--------------------------------------------------------------------------*/ EVAL_BM_SFFM::EVAL_BM_SFFM(const EVAL_BM_SFFM& p) :EVAL_BM_ACTION_BASE(p), _offset(p._offset), _amplitude(p._amplitude), _carrier(p._carrier), _modindex(p._modindex), _signal(p._signal), _end(NOT_VALID) { } /*--------------------------------------------------------------------------*/ bool EVAL_BM_SFFM::operator==(const COMMON_COMPONENT& x)const { const EVAL_BM_SFFM* p = dynamic_cast(&x); bool rv = p && _offset == p->_offset && _amplitude == p->_amplitude && _carrier == p->_carrier && _modindex == p->_modindex && _signal == p->_signal && EVAL_BM_ACTION_BASE::operator==(x); if (rv) { untested(); } return rv; } /*--------------------------------------------------------------------------*/ void EVAL_BM_SFFM::print(OMSTREAM& o, LANGUAGE lang)const { assert(lang == lSPICE || lang == lVERILOG); o << name(); print_pair(o, lang, "offset", _offset); print_pair(o, lang, "amplitude", _amplitude); print_pair(o, lang, "carrier", _carrier); print_pair(o, lang, "modindex", _modindex); print_pair(o, lang, "signal", _signal); EVAL_BM_ACTION_BASE::print(o, lang); } /*--------------------------------------------------------------------------*/ void EVAL_BM_SFFM::elabo3(const COMPONENT* c) { assert(c); const CARD_LIST* par_scope = c->scope(); assert(par_scope); EVAL_BM_ACTION_BASE::elabo3(c); _offset.e_val(_default_offset, par_scope); _amplitude.e_val(_default_amplitude, par_scope); _carrier.e_val(_default_carrier, par_scope); _modindex.e_val(_default_modindex, par_scope); _signal.e_val(_default_signal, par_scope); } /*--------------------------------------------------------------------------*/ void EVAL_BM_SFFM::tr_eval(ELEMENT* d)const { double time = SIM::time0; double mod = (_modindex * sin(M_TWO_PI * _signal * time)); double ev = _offset + _amplitude * sin(M_TWO_PI * _carrier * time + mod); tr_finish_tdv(d, ev); } /*--------------------------------------------------------------------------*/ bool EVAL_BM_SFFM::parse_numlist(CS& cmd) { int start = cmd.cursor(); int here = cmd.cursor(); for (PARAMETER* i = &_offset; i < &_end; ++i) { PARAMETER value(NOT_VALID); cmd >> value; if (cmd.stuck(&here)) { break; }else{ untested(); *i = value; } } if (cmd.gotit(start)) { untested(); } return cmd.gotit(start); } /*--------------------------------------------------------------------------*/ bool EVAL_BM_SFFM::parse_params(CS& cmd) { return ONE_OF || get(cmd, "Offset", &_offset) || get(cmd, "Amplitude", &_amplitude) || get(cmd, "Carrier", &_carrier) || get(cmd, "Modindex", &_modindex) || get(cmd, "Signal", &_signal) || EVAL_BM_ACTION_BASE::parse_params(cmd) ; } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ EVAL_BM_SFFM p1(CC_STATIC); DISPATCHER::INSTALL d1(&bm_dispatcher, "sffm", &p1); } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/