damaris-backends/drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h
2014-06-26 11:10:51 +00:00

89 lines
2.4 KiB
C++

#include <list>
#include "core/states.h"
#include "core/stopwatch.h"
#include "drivers/pulsegen.h"
class PulseBlasterCommand;
/**
\brief holds the complete and detailed initialisation of the device
*/
class PulseBlasterProgram: public std::list<PulseBlasterCommand*> {
public:
double internal_clock_freq;
size_t minimum_interval;
/**
supports recursive traverse of states, in order insert workarounds and assemble PulseBlasterProgram
*/
struct stackentry {
state_sequent* subsequence;
state_sequent::iterator subsequence_position;
PulseBlasterProgram::iterator command;
};
PulseBlasterProgram(size_t mi=9, double cf=1e8) {
internal_clock_freq=cf;
minimum_interval=mi;
}
/// do not copy the list. This must be done by the derived class...
PulseBlasterProgram(const PulseBlasterProgram& orig);
/// insert some commands and get references right
int insert_ref(PulseBlasterProgram::iterator target_pos,
PulseBlasterProgram::const_iterator start_copy,
PulseBlasterProgram::const_iterator end_copy);
/// appends a sequence of states to existing program
void append_sequence(const state& seq);
/// write all configuration to a file to xml
virtual int write_to_file(FILE* out, size_t indent=0) const=0;
/// create a suitable state for this kind of program
virtual PulseBlasterCommand* create_command(const state& the_state)=0;
/// create a copy or a minimal empty state
virtual PulseBlasterCommand* create_command(const PulseBlasterCommand* orig=NULL)=0;
virtual ~PulseBlasterProgram();
};
/**
\brief parameters for each pulseblaster command
*/
class PulseBlasterCommand {
public:
int ttls;
/// which instruction is used...
SpinCorePulseBlaster::opcode instruction;
/// data of instruction for loop counts
int loop_count;
/// length in units of clock cycle
size_t length;
/// the pulse program start iterator
const PulseBlasterProgram* program;
/// data of instruction for jumps
PulseBlasterProgram::const_iterator jump;
PulseBlasterCommand();
/// one for minimal length
PulseBlasterCommand(PulseBlasterProgram& p);
// a useful constructor for a simple CONTINUE state
PulseBlasterCommand(PulseBlasterProgram& p, int _ttls, double _length);
/// copy constructor
PulseBlasterCommand(const PulseBlasterCommand& orig);
/// write the command to a give file as xml tag
virtual int write_to_file(FILE* out, size_t indent=0) const=0;
virtual ~PulseBlasterCommand() {}
};