/*
Copyright (C) 1998-2003 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(__BITLOG_H__)
#define __BITLOG_H__
class Cycle_Counter;
// include the absolute minimum portion of GLIB to get the definitions
// for guint64, etc.
#include <glibconfig.h>
/**********************************************************************
* boolean event logging
*
* The boolean event logger is a simple class for logging the time
* of boolean (i.e. 0/1) events.
*
* The event buffer is an array of 64-bit wide elements. Each element
* stores the time at which an event occurs. The state of the event
* is encoded in the position of the array. In other words, "high"
* events are at the odd indices of the array and "low" ones at the
* even ones.
*
* No effort is made to compress the 64-bit time entries into smaller
* values. Consequently, a large amount of space is wasted.
*
* Repeated events are not logged. E.g.. if two 1's are logged, the
* second one is ignored.
*
* The total number of events is defined when the class is instantiated.
* The only requirement is that the number of events be an even power
* of 2. A check for this is made, and
*/
class BoolEventLogger {
private:
Cycle_Counter *gcycles; // Point to gpsim's cycle counter.
unsigned int index; // Index into the buffer
guint64 *buffer; // Where the time is stored
unsigned int max_events; // Size of the event buffer
public:
BoolEventLogger(unsigned int _max_events = 4096);
void event(bool state);
/*
get_index - return the current index
This is used by the callers to record where in the event
buffer a specific event is stored. (e.g. The start bit
of a usart bit stream.)
*/
inline unsigned int get_index() {
return index;
}
/// mod_index - get the index modulo buffer size (this
/// exposes an implementation detail...)
unsigned int mod_index(unsigned int unmodded_index)
{
return unmodded_index & max_events;
}
unsigned int get_index(guint64 event_time);
void dump(int start_index, int end_index=-1);
void dump_ASCII_art(guint64 time_step,
guint64 start_time,
int end_index=-1);
unsigned int get_event(int index)
{
return index & 1;
}
bool get_state(guint64 event_time)
{
return (get_index(event_time) & 1) ? true : false;
}
int get_edges(guint64 start_time, guint64 end_time)
{
return ( get_index(end_time) - get_index(start_time) ) & max_events;
}
guint64 get_time(unsigned int index)
{
return buffer[mod_index(index)];
}
};
/**********************************************************************
* ThreeState event logging
*
* The ThreeState event logger is a simple class for logging the time
* of 3-state events. (FixMe - the bitlog and bytelog classes should
* be deprecated and merged into this class).
*
* The event buffer stores both the event state and the 64-bit time
* at which it occurred. Event states are 'chars' so it is up to the
* client of this class to interpret what the events mean.
*
* Repeated events are not logged. E.g.. if two 1's are logged, the
* second one is ignored.
*
*/
class ThreeStateEventLogger {
private:
Cycle_Counter *gcycles; // Point to gpsim's cycle counter.
unsigned int index; // Index into the buffer
guint64 *pTimeBuffer; // Where the time is stored
char *pEventBuffer; // Where the events are stored
unsigned int max_events; // Size of the event buffer
bool bHaveEvents; // True if any events have been acquired
public:
ThreeStateEventLogger(unsigned int _max_events = 4096);
/// Log an Event
void event(char state);
inline unsigned int get_index() {
return index;
}
unsigned int get_index(guint64 event_time);
unsigned int get_nEvents(guint64 start_time,guint64 stop_time);
unsigned int get_nEvents(unsigned int start_index, unsigned int stop_index);
char get_state(unsigned int index)
{
return pEventBuffer[index & max_events];
}
char get_state(guint64 event_time)
{
return get_state(get_index(event_time));
}
guint64 get_time(unsigned int index)
{
return pTimeBuffer[index & max_events];
}
void dump(int start_index, int end_index=-1);
void dump_ASCII_art(guint64 time_step,
guint64 start_time,
int end_index=-1);
};
#endif //!defined(__BITLOG_H__)
syntax highlighted by Code2HTML, v. 0.9.1