/*
Copyright (C) 1998-2002 T. Scott Dattalo
Copyright (C) 2006 Roy R. Rankin
This file is part of gpsim.
gpsim 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.
gpsim 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 gpsim; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef __COMPARATOR_H__
#define __COMPARATOR_H__
/***************************************************************************
*
* Include file for: Processors with dual comparators and Voltage Refarence
*
*
*
***************************************************************************/
#define CFG_MASK 0x7
#define CFG_SHIFT 3
class CMSignalSource;
class VRSignalSource;
class CMCON;
enum compare_inputs
{
AN0 = 0,
AN1,
AN2,
AN3,
VREF = 6, // use reference voltage
NO_IN = 7 // no input port
};
enum compare_outputs
{
OUT0 = 0,
OUT1,
ZERO = 6, // register value == 0
NO_OUT = 7 // no ouput port
};
class VRCON : public sfr_register
{
public:
CMCON *_cmcon;
enum VRCON_bits
{
VR0 = 1<<0,
VR1 = 1<<1,
VR2 = 1<<2,
VR3 = 1<<3,
VRR = 1<<5,
VROE = 1<<6,
VREN = 1<<7
};
VRCON(void);
virtual void put(unsigned int new_value);
virtual void setIOpin(PinModule *);
virtual double get_Vref(void) { return(vr_Vref); };
protected:
PinModule *vr_PinModule;
double vr_Vref;
stimulus *vr_pu;
stimulus *vr_pd;
double vr_Rhigh;
double vr_Rlow;
char *pin_name; // original name of pin
};
class CM_stimulus : public stimulus
{
public:
CM_stimulus(CMCON *arg, const char *n=0,
double _Vth=0.0, double _Zth=1e12
);
CMCON *_cmcon;
virtual void set_nodeVoltage(double v);
};
class CMCON : public sfr_register
{
public:
VRCON *_vrcon;
enum CMCON_bits
{
CM0 = 1<<0,
CM1 = 1<<1,
CM2 = 1<<2,
CIS = 1<<3,
C1INV = 1<<4,
C2INV = 1<<5,
C1OUT = 1<<6,
C2OUT = 1<<7,
};
virtual void setINpin(int i, PinModule *);
virtual void setOUTpin(int i, PinModule *);
virtual void assign_pir_set(PIR_SET *new_pir_set);
virtual unsigned int get();
virtual void rename_pins(unsigned int) { cout << "CMCON::rename_pins() should not be called\n";}
virtual void put(unsigned int);
virtual void set_configuration(int comp, int mode, int il1, int ih1, int il2, int ih2, int out);
virtual double comp_voltage(int ind, int invert);
CMCON(void);
protected:
PinModule *cm_input[4];
PinModule *cm_output[2];
const char *cm_input_pin[4];
const char *cm_output_pin[2];
CMSignalSource *cm_source[2];
unsigned int m_CMval[2];
PIR_SET *pir_set;
CM_stimulus *cm_stimulus[4];
static const int cMaxConfigurations=8;
static const int cMaxComparators=2;
unsigned int m_configuration_bits[cMaxComparators][cMaxConfigurations];
};
class COMPARATOR_MODULE
{
public:
CMCON *cmcon;
VRCON vrcon;
void initialize( PIR_SET *pir_set, PinModule *pin_vr0, PinModule *pin_cm0,
PinModule *pin_cm1, PinModule *pin_cm2,
PinModule *pin_cm3, PinModule *pin_cm4);
void initialize( PIR_SET *pir_set, PinModule *pin_vr0, PinModule *pin_cm0,
PinModule *pin_cm1, PinModule *pin_cm2,
PinModule *pin_cm3, PinModule *pin_cm4, PinModule *pin_cm5);
};
#endif // __COMPARATOR_H__
syntax highlighted by Code2HTML, v. 0.9.1