diff --git a/Ccs/cmd_sequencer.py b/Ccs/cmd_sequencer.py new file mode 100644 index 0000000000000000000000000000000000000000..d6013763f35aa28dc76b267bced3659ad34e4c61 --- /dev/null +++ b/Ccs/cmd_sequencer.py @@ -0,0 +1,109 @@ +""" +Tools to create and interpret general purpose command sequences +""" + +import ctypes + +NOP = 0b000 +UPDT = 0b001 +MOD = 0b010 +CMT = 0b011 +CBLK = 0b100 +VER = 0b101 + +DATUM_BYTES_N = 4 + + +class InstructionWord(ctypes.BigEndianStructure): + _pack_ = 1 + _fields_ = [("CMD", ctypes.c_uint32, 3), + ("IM", ctypes.c_uint32, 1), + ("DELAY", ctypes.c_uint32, 12), + ("REG", ctypes.c_uint32, 6), + ("SHIFT", ctypes.c_uint32, 5), + ("WIDTH", ctypes.c_uint32, 5)] + + def __str__(self): + return '\n'.join(['{}: {}'.format(i[0], getattr(self, i[0])) for i in self._fields_]) + + +class Command(ctypes.BigEndianStructure): + _pack_ = 1 + _fields_ = [("INSTRUCTION", InstructionWord), + ("DATUM", ctypes.c_uint32)] + + def __str__(self): + return self.INSTRUCTION.__str__() + '\nDATUM: 0x{:08X}'.format(self.DATUM) + + +class BlockCommit(ctypes.BigEndianStructure): + _pack_ = 1 + _fields_ = [("INSTRUCTION", InstructionWord), + ("N", ctypes.c_uint32, 6), + ("RESERVED", ctypes.c_uint32, 26)] + + def __str__(self): + return self.INSTRUCTION.__str__() + '\nN: {}'.format(self.N) + + +def nop(): + + cmd = Command() + cmd.INSTRUCTION.CMD = NOP + + return cmd + +def updt(reg, im, delay): + + cmd = Command() + cmd.INSTRUCTION.CMD = UPDT + cmd.INSTRUCTION.REG = reg + cmd.INSTRUCTION.IM = im + cmd.INSTRUCTION.DELAY = delay + + return cmd + +def mod(reg, shift, width, datum): + + cmd = Command() + cmd.INSTRUCTION.CMD = MOD + cmd.INSTRUCTION.REG = reg + cmd.INSTRUCTION.SHIFT = shift + cmd.INSTRUCTION.WIDTH = width + cmd.DATUM = datum + + return cmd + +def cmt(reg, im, delay): + + cmd = Command() + cmd.INSTRUCTION.CMD = CMT + cmd.INSTRUCTION.REG = reg + cmd.INSTRUCTION.IM = im + cmd.INSTRUCTION.DELAY = delay + + return cmd + +def cblk(reg, n, delay, im): + + cmd = BlockCommit() + cmd.INSTRUCTION.CMD = CBLK + cmd.INSTRUCTION.REG = reg + cmd.INSTRUCTION.IM = im + cmd.INSTRUCTION.DELAY = delay + cmd.N = n + + return cmd + +def ver(reg, im ,delay, shift, width, datum): + + cmd = Command() + cmd.INSTRUCTION.CMD = VER + cmd.INSTRUCTION.IM = im + cmd.INSTRUCTION.DELAY = delay + cmd.INSTRUCTION.REG = reg + cmd.INSTRUCTION.SHIFT = shift + cmd.INSTRUCTION.WIDTH = width + cmd.DATUM = datum + + return cmd