/*
Copyright (C) 1998 T. Scott Dattalo
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. */
#if !defined(__TRIGGER_H__)
#define __TRIGGER_H__
#include <string>
using namespace std;
class TriggerObject;
class TraceType;
class Expression;
class Trace;
//========================================================================
//
// Triggers
// (these comments are not completely implemented in code)
//
// gpsim divides a breakpoint into a TriggerAction and a TriggerObject.
// The TriggerObject is something that gets evaluated. If it evaluates
// to true then a TriggerAction is invoked.
// Most breakpoints are simple and don't need this complexity. For example,
// an execution breakpoint only needs to halt simulation whenever it's
// encountered. But gpsim defines the TriggerObject to be something like
// 'if address is executed' and the TriggerAction to be 'halt simulation'.
// However this design accomodates much more complicated situations. For
// example, the use may wish to break whenever register 42 is cleared during
// a time when interrupts are disabled. In this case, the trigger action
// is still a simple halt. However, the trigger object is more complicated:
//
// break w reg(42) (reg(42) == 0) && (STATUS & GIE == 0)
//
// In this case, the compound expression gets associated with write operations
// to register 42.
class TriggerAction
{
public:
TriggerAction();
virtual ~TriggerAction() {}
virtual bool evaluate();
virtual bool getTriggerState();
virtual void action();
};
class SimpleTriggerAction : public TriggerAction
{
public:
SimpleTriggerAction(TriggerObject *_to);
virtual void action();
protected:
TriggerObject *to;
};
// TriggerObject - a base class for handling all of gpsim's breakpoints.
//
// The TriggerObject class is designed to be part of a multiple inheritance
// class heirarchy. Its main function is to provide an interface to the
// breakpoint functionality.
//
//
class TriggerObject
{
public:
unsigned int bpn;
// Enable the breakpoint and return true if successful
virtual bool set_break() {return false;}
// A unique number assigned when the break point is armed.
int CallBackID;
// When the breakpoint associated with this object is encountered,
// then 'callback' is invoked.
virtual void callback();
// Invoked to display info about the breakpoint.
virtual void callback_print();
// clear_trigger is invoked when the breakpoint associated with
// this object is cleared.
virtual void clear_trigger() {};
// Will search for a place to store this break point.
virtual int find_free();
// This object has no cpu associated with it. However, derived
// types may and can choose to provide access to it through here:
//virtual Processor *get_cpu() { return 0; }
// Display the breakpoint - Probably should tie into a stream...
virtual void print();
virtual int printExpression(char *pBuf, int szBuf);
// Display traced information. Given an index into a Trace buffer,
// printTraced() will extract the traced information and decode it
// into a readable form.
virtual int printTraced(Trace *pTrace, unsigned int tbi,
char *pBuf, int szBuf);
// Clear the breakpoint
virtual void clear();
// set_Expr - associates an expression with the trigger
virtual void set_Expression(Expression *);
virtual bool bHasExpression() { return m_PExpr!=0; }
virtual bool eval_Expression();
virtual char const * bpName() { return "Generic"; }
virtual void set_action(TriggerAction *ta) { m_action = ta; }
virtual TriggerAction *get_action() { return m_action;}
virtual void invokeAction();
// Messages can be associatated with triggers
string &message() {return m_sMessage;}
virtual void new_message(const char *);
virtual void new_message(string &);
TriggerObject();
TriggerObject(TriggerAction *);
// Virtual destructor place holder
virtual ~TriggerObject() { }
protected:
// A block of trace types are reserved by the trigger class:
static TraceType *m_brt;
private:
Expression *m_PExpr;
string m_sMessage;
// When the TriggerObject becomes true, then the TriggerAction is
// evaluated. E.g. If the trigger object is an execution breakpoint,
// then whenever the PC == break address, the Breakpoint_Instruction
// class (which is derived from this class) will invoke action->evaluate()
// which will in turn halt the execution.
TriggerAction *m_action;
};
#endif // !defined(__TRIGGER_H__)
syntax highlighted by Code2HTML, v. 0.9.1