Introduction
LATC as a system doesn't provide an interface for manipulating the LATC xml as a system. Also, due to some features of the LATC compiler (LATC_parser), there are subtleties in attempting to simply "chain" different sets of XML together to create a correct description of the detector
Interface
The <foo> package contains a simple interface to an in-memory model of the LATC register space. A top level object, LATC_LAT, is provided which constitutes the top level interface to the LATC register hierarchy. This package contains several base classes: LATCComponent, LATCComponentDict, LATCRegister. The top level object is instantiated with a simple:
lat = LATC_LAT()
LATCComponent
The base class of all LATC component objects (such as LATC_LAT, LATC_TEM, LATC_AFE). LATCComponent objects contain sets of LATCComponents and sets of LATCRegisters. These sets may be empty.
All LATCComponent objects define the following methods:
name() Returns the component's name (a string) components() Returns a dict of LATCComponent objects (may be empty). Example: lat.components().keys() returns: ['AEM', 'TEM', 'GEM'] nComponents() Returns the length of the components() dict registers() Returns a dict of LATCRegister objects (may be empty). Example: lat.components()['AEM'].registers().keys() returns: ['trgseq', 'aem_configuration'] addComponent(name, component) Adds a component to the object. ***Not normally used by the user. addRegister(name, register) Adds a register to the object. ***Not normally used by the user.
There also exists a more intuitive interface for LATCComponents. The user can reference the components and registers of a component by name. For example, the following two code snippets are equivalent:
>>> aem = lat.components()['AEM'] >>> trgseq = lat.components()['AEM'].registers()['trgseq']
>>> aem = lat.AEM >>> trgseq = lat.AEM.trgseq
LATCComponentDict
A LATCComponentDict is a dictionary of LATCComponent objects. It inherits from the python dict class. It is used in component() dictionaries as a collection of substantively identical objects, mainly to ease the referencing of these objects.
>>> lat.TEM.keys() [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] >>> lat.TEM[5] <latcBuilt.LATC_TEM object at 0x15caa30>
LATCRegister
A LATCRegister is a BitField with an integrated, unchangable field definition. It is constructed with a dictionary indicating the bit field names and positions. For example, the following code creates a LATCRegister with a name of engine_4, initialized to 0, with a set of bitfields spanning bits 0 through 29:
>>> engine4 = LATCRegister('engine_4', 0x0, {'prescale':(0,8), 'inhibit':(15,16), 'calstrobe':(16,17), 'tack':(19,20), 'four_range':(20,21), 'zero_suppress':(21,22), 'marker':(22,25), 'destination':(25,29) })
LATCRegisters implement the following methods:
name() Return the name of the register set(ui) Set the value of this register to ui bf_def() Return the bitfield definition dictionary, as above
Fields of a LATCRegister can be referenced in the same way as components of a LATCComponent:
>>> p = engine4.prescale