Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

/var/pcce/usera/hill/rcc_1.2/RodDaq/RodCrate/RodModule.h

Go to the documentation of this file.
00001 //File: RodModule.h
00002 
00003 #ifndef SCTPIXELROD_RODMODULE_H 
00004 #define SCTPIXELROD_RODMODULE_H
00005 
00006 #include <fstream> 
00007 #include <iostream>
00008 #include <string>
00009 #include <ctime>     // Pick up clock() function and clock_t typedef
00010 #include <new>
00011 
00012 #include "RodPrimitive.h" 
00013 #include "RodPrimList.h"
00014 #include "../../VmeInterface/VmeInterface.h" 
00015 #include "../../VmeInterface/VmePort.h"
00016 #include "../../VmeInterface/VmeModule.h"
00017 #include "../CommonWithDsp/processor.h"
00018 #include "RodRegisterBits.h"
00019 #include "../CommonWithDsp/smSendTxtBuff.h"
00020 #include "RodDspAddresses.h"
00021 #include "RodVmeAddresses.h"
00022 #include "RodOutList.h"
00023 #include "../CommonWithDsp/txtBuffer.h"
00024 
00025 namespace SctPixelRod {
00026 
00027 enum TextBuffState {TEXT_IDLE, TEXT_RQ_SET, TEXT_READOUT, TEXT_ERROR};
00028 enum PrimState {PRIM_IDLE, PRIM_LOADED, PRIM_EXECUTING, PRIM_WAITING, PRIM_PAUSED}; 
00029 enum TEXT_BUFFER_TYPE {TEXT_ERR, TEXT_INFO, TEXT_DIAG, TEXT_XFER, TEXT_UNDEF};
00030 enum HpidMode {DYNAMIC, AUTO, NO_AUTO};
00031 
00032 //------------------------------NoImageFile--------------------------------- 
00033 
00034 /*! @class NoImageFile
00035  *
00036  *  @brief This is an exception class for when a binary image file is not found.
00037  *
00038  *  If we try to load a binary image for a master or slave DSP and the file is 
00039  *  not found, an object of this class is thrown.
00040  *
00041  *  @author Tom Meyer (meyer@iastate.edu) - originator
00042  */
00043 
00044 class NoImageFile {
00045 public:
00046   NoImageFile( std::string fileName) {m_fileName=fileName;};
00047   std::string getFileName() {return m_fileName;};
00048 
00049 private:
00050   std::string m_fileName;
00051 };                                                                             
00052 
00053 //------------------------------HpiException--------------------------------- 
00054 
00055 /*! @class HpiException
00056  *
00057  *  @brief This is an exception class for Host Port Interface errors.
00058 
00059  *  This class is thrown if an error in an HPI read/write operation is detected.
00060  *
00061  *  @author Tom Meyer (meyer@iastate.edu) - originator
00062  */
00063 
00064 class HpiException {
00065 public:
00066   HpiException( std::string descriptor, unsigned long calcAddr, unsigned long readAddr);
00067   std::string getDescriptor() {return m_descriptor;};
00068   unsigned long getCalcAddr() {return m_calcAddr;};
00069   unsigned long getReadAddr() {return m_readAddr;};
00070 
00071 private:
00072   std::string m_descriptor;    // A text description of the error
00073   unsigned long m_calcAddr;    // The calculated (expected) address
00074   unsigned long m_readAddr;    // The address actually read
00075 };                                                                            
00076 
00077 //------------------------------RodException------------------------------ 
00078 
00079 /*! @class rodException
00080  *
00081  *  @brief This is a general exception class for ROD errors.
00082  *
00083  *  This class is thrown if an error in a ROD operation is detected.
00084  *
00085  *  @author Tom Meyer (meyer@iastate.edu) - originator
00086  */
00087 
00088 class RodException {
00089 public:
00090   RodException( std::string descriptor);
00091   RodException( std::string descriptor, unsigned long data1);
00092   RodException( std::string descriptor, unsigned long data1, unsigned long data2);
00093   std::string getDescriptor() {return m_descriptor;};
00094   unsigned long getData1() {return m_data1;};
00095   unsigned long getData2() {return m_data2;};
00096 
00097 private:
00098   std::string m_descriptor;    // A text description of the error
00099   unsigned long m_numData;  // Number of data values returned
00100   unsigned long m_data1;    // First data value returned
00101   unsigned long m_data2;    // Second data value returned
00102 };                                                                            
00103 
00104 //------------------------------------------------------------------------------              
00105 //! RodModule: 
00106 /*! @class RodModule
00107  *
00108  *  @brief This is a derived class providing the software interface for VME ROD modules.
00109  *
00110  *  This is the implementation of a ROD class derived from the VmeModules base class 
00111  *  It should be the sole interface for VME communication with the ROD modules.
00112  *
00113  *  @author Tom Meyer (meyer@iastate.edu) - originator
00114  */
00115 
00116 class RodModule : public VmeModule {
00117 
00118 public:
00119 
00120   // Constructors, destructor, and assignment
00121   RodModule( unsigned long baseAddr, unsigned long mapSize, VmeInterface & ourInterface, 
00122              long numSlaves) throw (RodException&, VmeException &);
00123   RodModule(const RodModule& rhs);
00124   RodModule &operator=(const RodModule & rhs);
00125   virtual ~RodModule();                                  // Destructor
00126   
00127   // Accessor functions
00128 
00129   unsigned long getBaseAddress() {return m_baseAddress; }
00130   long getSlot() const { return m_slot; }
00131   unsigned long getSerialNumber() {return m_serialNumber;};
00132   void setNumSlaves( long numSlaves) { m_numSlaves = numSlaves; }
00133   long getNumSlaves() const { return m_numSlaves; }
00134   void setFinBufferSize( long finBufferSize) { m_finBufferSize = finBufferSize;}
00135   long getFinBufferSize() const { return m_finBufferSize; }
00136   std::string getMasterImageName() {return m_masterImageName; }
00137   std::string getslaveEmifName(long slaveNum) {return m_slaveEmifName[slaveNum];}
00138   std::string getslaveIpramName(long slaveNum) {return m_slaveIpramName[slaveNum];}
00139   std::string getslaveIdramName(long slaveNum) {return m_slaveIdramName[slaveNum];}
00140   std::string getslaveExtName(long slaveNum) {return m_slaveExtName[slaveNum];}
00141   unsigned long getVmeCommandRegVal(long regNum) {
00142     return m_vmeCommandReg[regNum];
00143   };
00144   VmePort* getVmePort() {return m_myVmePort; };
00145   void setOutList(RodOutList* outList) {m_myOutList = outList;};
00146   RodOutList* getOutList() {return m_myOutList;};
00147   PrimState getPrimState() {return m_myPrimState;};
00148   TextBuffState getTextState() {return m_myTextState;};
00149   
00150   long getMode() { return long(m_txtBuffer.mode);};
00151   long getOverwrite() {return long(m_txtBuffer.overwrite);};
00152   long getOverflow() {return long(m_txtBuffer.overflow);};
00153   long getWrap() {return long(m_txtBuffer.wrap);};
00154   TEXT_BUFFER_TYPE getTextBufferType() {return m_textType;};
00155     
00156 /*! initialize() performs all actions necessary to place a properly loaded ROD 
00157 in its initialized state, except for initializing the slave DSPs. This must be done
00158 separately using initSlaveDsp().
00159 
00160 Activities:
00161     Reset the ROD
00162     Read ROD serial number
00163     Load 0x000l000l into Master DSP HPIC register. (Says low order 16-bit word
00164                                                     comes first)
00165     Read back HPIC to verify
00166     Retrieve pointers to text buffer structs
00167     Initialize PrimList and TextBuff state variables
00168 */
00169   void initialize() throw (RodException &, VmeException &);
00170   
00171 /*! reset() issues a reset signal to the ROD, clears IDRAM, resets all DSPs, and
00172  *  re-initializes all state variables.
00173 */
00174   void reset() throw (RodException&, VmeException &);
00175 
00176 /*! status() reports the status of the ROD.
00177  *  For now, it simply prints to standard output. Later we will add a structured
00178  *  report of name=value pairs.
00179 */
00180   void status () throw();
00181 
00182 /*! initSlaveDsp() initializes a given slave DSP.
00183  *  Activities:
00184  *     - set HPIC to make first halfword most significant
00185  *     - load the binary images for EMIF registers, IPRAM, IDRAM, and external
00186  *       memory
00187  *     - start the slave executing.  This should start flashing the green front 
00188  *       panel LED for this slave.  
00189  */
00190   void initSlaveDsp(const std::string & emifFile, const std::string & ipramFile,
00191      const std::string & idramFile,const std::string & extFile, 
00192      const long slaveNumber) throw(RodException&, NoImageFile&, VmeException &);
00193      
00194 /*! loadSlaveImage() reads a binary file from disk and loads it into the slave
00195  *  memory space at the specified location.
00196  *  Usually, the optional last argument should be omitted.
00197  */
00198   void loadSlaveImage(const std::string & filename, const unsigned long address,
00199         const long slaveNumber, char opt='n') 
00200         throw (NoImageFile &, RodException &, VmeException &);
00201                       
00202 /*! startSlave() sends a START_SLAVE_EXECUTING primitive to start a given slave
00203  *  DSP. Usually, the optional last argument should be omitted.
00204  */
00205   void startSlave(const long slaveNumber, char mode='s') throw(VmeException &);
00206   
00207 /*! synchSendPrim() synchronously sends a single primitive to the MDSP and 
00208  *  handles the calls to primHandler() to finish the transfer before returning 
00209  *  control to its calling routine.  It is not the normal way to send 
00210  *  primitives, but is useful for initialization where time criticality is not 
00211  *  so much of a factor.
00212  *
00213  *  The present version writes to cout. This needs to be changed.
00214  */
00215   void synchSendPrim(RodPrimitive & prim) throw (RodException &, VmeException &) ;
00216 
00217 /*!sendPrimList() is the first of five steps in sending a primitive list to
00218  *  the master DSP. It writes the primitive list to the InListBuffer in SDRAM0.
00219  *  
00220  *  To send a PrimList:
00221  *    1. sendPrimList(destAddr, &primBuffer)
00222  *    2. Poll until DspAck = 0 using getDspAck()
00223  *    3. Set InListReady bit using setInListReady()
00224  *    4. poll until DspAck = 1 using getDspAck()
00225  *    5. getOutList(repAddr, &repBuffer)  Note: repBuffer=0 if there is no 
00226  *    reply Buffer
00227  */
00228   void sendPrimList(RodPrimList *l) throw(VmeException &) ;
00229   
00230 /*! primHandler() handles steps 2-4 in sending a primitive list to
00231  *  the master DSP. Its action depends on the value of the m_myPrimState state
00232  *  variable.
00233  */
00234   PrimState primHandler() throw (RodException &, VmeException &);
00235   
00236 //! Get DspAck bit
00237   inline bool getDspAck() {return readRodStatusBit(0, DSPACK);};
00238   
00239 //! Set InListReady bit
00240   inline void setInListReady(){setVmeCommandRegBit(INLISTRDY); return;};
00241   
00242 //! Delete reply buffer object
00243   void deleteOutList() throw() ;
00244 
00245 /*! getAllTextBuffBits() reads all four text_buffer_not_empty bits at once, do 
00246  *  if checkAllTextBuffs returns a TRUE value.
00247  */
00248   inline long getAllTextBuffBits() {   
00249     unsigned long regValue;
00250     regValue = readRodStatusReg(0);
00251     return (regValue>>TEXT_BUFF_NOT_EMPTY[0] & 0xF);
00252   };
00253   
00254 /*! textHandler() handles reading a text buffer from the rod into a
00255  *  RodTextBuff object. Its action depends on the value of the m_myTextState 
00256  *  state variable.
00257  *  @return The value of the text buffer state variable at the end of execution.
00258  */
00259   TextBuffState textHandler() throw(VmeException &) ;
00260   
00261 /*! getTextBuffer() reads a complete text buffer into destBuffer. Buffnumber is
00262  *  0 for ERR buffer, 1 for INFO buffer, 2 for DIAG buffer, and 3 for the XFER
00263  *  buffer. This function should be called only if checkAllTextBits shows the 
00264  *  corresponding bit set in Status Register 0.
00265  */
00266   void getTextBuffer(char * buffer, long & length, TEXT_BUFFER_TYPE & type)
00267       throw();
00268   
00269 /*! clearTextBuffer() clears a text buffer so it can be reused.
00270 */
00271   void clearTextBuffer() throw();
00272 
00273 //! Inline method to read one ROD Status Register via HPI
00274   inline unsigned long readRodStatusReg(long regNumber) {
00275     unsigned long regValue;
00276     regValue = mdspSingleRead(STATUS_REG[regNumber]);
00277     return regValue;
00278   };
00279   
00280 //! Inline method to read one ROD Command Register via HPI
00281   inline unsigned long readRodCommandReg(long regNumber) {
00282     unsigned long regValue;
00283     regValue = mdspSingleRead(COMMAND_REG[regNumber]);
00284     return regValue;
00285   };
00286   
00287 //! Inline method to read one ROD Status Register Bit via HPI
00288   inline bool readRodStatusBit(long regNumber, long bitNumber) {
00289     unsigned long rodStatusReg;
00290     rodStatusReg = readRodStatusReg(regNumber);
00291     return (0x1) & (readRodStatusReg(regNumber)>>bitNumber);
00292   };
00293   
00294 //! Inline method to set VmeCommand Register Bit
00295   inline void setVmeCommandRegBit(const long bitNumber) {
00296     setBit(&m_vmeCommandReg[0], bitNumber);
00297     mdspSingleWrite(COMMAND_REG[0], m_vmeCommandReg[0]);
00298     return;
00299   };
00300   
00301 //! Inline method to clear VmeCommand Register Bit
00302   inline void clearVmeCommandRegBit(const long bitNumber) {
00303     clearBit(&m_vmeCommandReg[0], bitNumber);
00304     mdspSingleWrite(COMMAND_REG[0], m_vmeCommandReg[0]);
00305     return;
00306   };
00307   
00308 /*! hpiLoad() loads a 32-bit value into the HPIA or HPID register. Although 
00309  *  the HPI has a 16-bit data path, we use a 32-bit VME access and the word is 
00310  *  broken into two 16-bit values in the ROD firmware.
00311 */
00312   void hpiLoad(const unsigned long hpiReg, const unsigned long hpiValue) 
00313        throw(VmeException &);
00314 
00315 /*! hpiFetch() fetches a 32-bit value from one of the HPI registers. Although 
00316  *  the HPI has a 16-bit data path, we use a 32-bit VME access, with the ROD 
00317  *  firmware doing the necessary conversion.
00318 */
00319   unsigned long hpiFetch(const unsigned long hpiReg) throw(VmeException &);
00320 
00321 /*! mdspSingleRead() reads a single 32-bit word from the Master DSP SDRAM via 
00322  *  its Host Port Interface (HPI).
00323 */
00324   unsigned long mdspSingleRead(const unsigned long dspAddr) throw(VmeException &);
00325 
00326 /*! mdspSingleWrite() writes a single 32-bit word to the Master DSP SDRAM via 
00327  *  its Host Port Interface (HPI).
00328 */
00329   void mdspSingleWrite(unsigned long dspAddr, unsigned long buffer) 
00330     throw(VmeException &);
00331 
00332 /*! mdspBlockRead() reads a block of size wordCount 32-bit words from the Master 
00333  *  DSP SDRAM via its Host Port Interface (HPI). 
00334  *  The present version uses a loop over single word reads instead of a block
00335  *  read.
00336 */
00337   void mdspBlockRead(const unsigned long dspAddr, unsigned long *buffer, 
00338        long wordCount, HpidMode mode=DYNAMIC) 
00339        throw (HpiException &, VmeException &);
00340 
00341 /*! mdspBlockWrite() writes a buffer of wordCount 32-bit words to the Master DSP 
00342  *  SDRAM via its Host Port Interface (HPI).
00343  *  The present version uses a loop over single word writes instead of a block
00344  *  write.
00345 */
00346   void mdspBlockWrite(const unsigned long dspAddr, unsigned long *buffer, 
00347        long wordCount, HpidMode mode=DYNAMIC) 
00348        throw (HpiException &, VmeException &);
00349 
00350 /*! mdspBlockDump() reads a block of MDSP memory and write it to a binary file 
00351  *  (debug use only)
00352  */
00353   void mdspBlockDump(const unsigned long firstAddress, 
00354        const unsigned long lastAddress, const std::string & fileName) 
00355        throw(RodException &, VmeException &);
00356                      
00357 /*! slvHpiLoad() loads a 32-bit value into a slave's HPIA or HPID register. 
00358  *  Endian swapping, if needed, is done in mdspSingleWrite.
00359  */
00360   void slvHpiLoad(unsigned long hpiReg, unsigned long hpiValue,
00361                            long slaveNum) throw(VmeException &);
00362                            
00363 /*! slvHpiFetch() fetches a 32-bit value from a slave's HPI registers. 
00364  *  Endian swapping, if needed, is done in mdspSingleRead.
00365  */
00366   unsigned long slvHpiFetch(unsigned long hpiReg, long slaveNum) 
00367                 throw(VmeException &);
00368 
00369 /*! slvSingleRead() reads a single 32-bit word from the the memory space of a 
00370  *  slave DSP. Endian swapping, if needed, is done in mdspSingleRead.
00371  */
00372   unsigned long slvSingleRead(unsigned long dspAddr, long slaveNum ) 
00373                 throw(VmeException &);
00374                                           
00375 /*! slvSingleWrite() writes a single 32-bit word to a slave DSP SDRAM via its
00376  *  Host Port Interface (HPI). Endian swapping, if needed, is done in 
00377  *  mdspSingleWrite.
00378  */
00379   void slvSingleWrite(unsigned long dspAddr, unsigned long buffer, 
00380        long slaveNum) throw(VmeException &);
00381 
00382 /*! slvBlockRead() reads a block of size wordCount 32-bit words from a slave 
00383  *  DSP's SDRAM via its Host Port Interface (HPI). Endian swapping, if needed, 
00384  *  is done in mdspBlockRead. Usually, the optional last argument should be
00385  *  omitted.
00386  */
00387   void slvBlockRead(const unsigned long dspAddr, unsigned long buffer[],
00388        const long wordCount, long slaveNum, HpidMode mode=DYNAMIC) 
00389        throw (HpiException &, VmeException &);
00390                 
00391 /*! slvBlockWrite() writes a buffer of wordCount 32-bit words to a slave DSP's 
00392  *  SDRAM via its Host Port Interface (HPI). Endian swapping, if needed, is 
00393  *  done in mdspBlockWrite. Usually, the optional last argument should be
00394  *  omitted.
00395  */
00396   void slvBlockWrite(unsigned long dspAddr, unsigned long buffer[], 
00397        const long wordCount, long slaveNum, HpidMode mode=DYNAMIC) 
00398         throw (HpiException &, VmeException &);
00399          
00400 /*! resetMasterDsp() resets the Master DSP via FPGA Control Register 2
00401  */
00402   void resetMasterDsp() throw(VmeException &);
00403   
00404 /*! resetSlaveDsp() resets a slave DSP via FPGA Control Register 2
00405  */
00406   void resetSlaveDsp(long slaveNumber) throw(VmeException &);
00407   
00408 /*! resetAllDsps() resets all five DSPs via FPGA Control Register 2
00409  */
00410   void resetAllDsps() throw(VmeException &);
00411   
00412 /*! chipEraseHpi(VmeException &) erases the master program flash memory chip.
00413  */
00414   void chipEraseHpi() throw(VmeException &);
00415   
00416 /*! sectorErase() erases a sector of FPGA flash memory.
00417  */
00418   void sectorErase(unsigned long sectorBaseAddress) 
00419        throw(RodException &, VmeException &) ;
00420   
00421 /*! writeByteToFlash() writes a byte to FPGA flash memory.
00422  */
00423   void writeByteToFlash(unsigned long address, UINT8 data) 
00424        throw (RodException &, VmeException &);
00425   
00426 /*! writeBlockToFlash() writes a block to FPGA flash memory.
00427  */
00428   void writeBlockToFlash(unsigned long address, UINT8 *data, 
00429                       unsigned long numBytes) throw(VmeException &);
00430                       
00431 /*! writeBlockToFlashHpi() writes a block to the master program flash memory.
00432  */
00433   void writeBlockToFlashHpi(unsigned long address, UINT8 *data, unsigned long numBytes)
00434                             throw (RodException &, VmeException &);
00435                             
00436 /*! readByteFromFlash( reads a byte from FPGA flash memory.
00437  */  
00438   UINT8 readByteFromFlash(unsigned long address, long updateAddress) 
00439                             throw (RodException &, VmeException &);
00440                             
00441 /*! vmeWriteElementFlash() does a VME write of an element to an FPGA flash.
00442  */  
00443   void vmeWriteElementFlash(UINT8 value, unsigned long address, 
00444                  long handshakeBit) throw (RodException &, VmeException &);
00445                  
00446 /*! readBlockFromFlash() reads a block from FPGA flash memory.
00447  */  
00448   void readBlockFromFlash(unsigned long address, UINT8 *buffer, unsigned long
00449                           numBytes) throw(VmeException &) ;
00450                           
00451 /*! commonEraseCommands() implements common erase commands for the FPGA flash.
00452  */  
00453   void commonEraseCommands(unsigned long flashBaseAddr) throw(VmeException &);
00454   
00455 /*! commonEraseCommandsHpi() implements common erase commands for the master 
00456  *  program flash.
00457  */  
00458   void commonEraseCommandsHpi(unsigned long flashBaseAddr) throw(VmeException &);
00459    
00460 /*! sleep() sleeps for a given number of milliseconds, VmeException &
00461 */
00462   void sleep(const double milliSecs);
00463 
00464 /*! checkSum() calculates a bit-wise XOR checksum on an array
00465 */
00466   unsigned long checkSum(const unsigned long *sourceArray, const long wordCount);
00467   
00468 /*! endianReverse32( reverses the endian-ness of a 32 bit value
00469 */
00470   unsigned long endianReverse32(const unsigned long inVal);
00471   
00472 
00473 private:
00474   //! inline bit manipulation functions
00475   inline void setBit(unsigned long *var, long bitNumber) {
00476     *var = *var | (1<<bitNumber);
00477     return;
00478   }
00479   
00480   inline void clearBit(unsigned long *var, long bitNumber) {
00481     *var&=(~(1<<bitNumber));
00482     return;
00483   }
00484   
00485   inline bool readBit(unsigned long var, long bitNumber) 
00486     {return ((var>>bitNumber)&1);}
00487   
00488   //! Slot number in VME crate
00489   long m_slot;
00490   
00491   //! Board serial number (read during init, dummy valued loaded by constructor
00492   unsigned long m_serialNumber;
00493   
00494   //! VME Port handle
00495   VmePort* m_myVmePort;
00496   
00497   //! Number of slave DSPs on this ROD.
00498   long m_numSlaves;
00499 
00500   //! Size of file input buffer, in bytes. Default=4096 bytes, probably good enough 
00501   long m_finBufferSize;
00502 
00503   //! string holding name of master image file
00504   std::string m_masterImageName;
00505 
00506   //! string array holding names of slave EMIF image files
00507   std::string m_slaveEmifName[4];
00508 
00509   //! string array holding names of slave IPRAM image files
00510   std::string m_slaveIpramName[4];
00511 
00512   //! string array holding names of slave IDRAM image files
00513   std::string m_slaveIdramName[4];
00514 
00515   //! string array holding names of slave external image files
00516   std::string m_slaveExtName[4];
00517 
00518   //! Cached copy of VME command registers and ROD status registers
00519   unsigned long m_vmeCommandReg[2];
00520   unsigned long m_rodStatusReg[3];
00521   
00522   //! A pointer to the array holding a reply buffer from a PrimList
00523   RodOutList* m_myOutList;
00524   
00525   //! State variable for sending primitive lists
00526   PrimState m_myPrimState;
00527       
00528   //! State variable for reading text buffers
00529   TextBuffState m_myTextState;
00530   
00531   //! Text buffer type
00532   TEXT_BUFFER_TYPE m_textType;
00533   
00534   //! A struct holding text buffer info from txtbuffer.h
00535   struct TXTBUFFER m_txtBuffer;
00536   
00537   //! A local buffer to hold the text data
00538   char m_textData[TEXT_BUFF_SIZE];
00539   
00540   //! Array of pointers to the text buffers in MasterDSP space
00541   unsigned long* m_textBuff[N_TXT_BUFFS];
00542   
00543 }; // End of class RodModule declaration
00544 
00545 }; //  End namespace SctPixelRod
00546 
00547 //---------------------------- Overload operator<< -----------------------------
00548 /* This overloaded operator lets us use cout to print the status of the ROD
00549 */
00550   ostream& std::operator<<(ostream& os, SctPixelRod::RodModule& rod);
00551 
00552 #endif // SCTPIXELROD_RODMODULE_H
00553 

Generated on Mon Mar 3 11:16:17 2003 for SCTPixelDAQ by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001