##############################################################################
## This file is part of 'SLAC Firmware Standard Library'.
## It is subject to the license terms in the LICENSE.txt file found in the 
## top-level directory of this distribution and at: 
##    https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html. 
## No part of 'SLAC Firmware Standard Library', including this file, 
## may be copied, modified, propagated, or distributed except according to 
## the terms contained in the LICENSE.txt file.
##############################################################################
#schemaversion 3.0.0
#once AxiStreamDmaRingWrite.yaml

AxiStreamDmaRingWrite: &AxiStreamDmaRingWrite
  class: MMIODev
  configPrio: 1
  description: DMA Ring Buffer Manager
  size: 0x1000
  metadata:
    numBuffers: &numBuffers 4
    destEnums: &destEnums
        - name: Software
          value: 0
        - name: Auto-Readout
          value: 1
    destHidden: &destHidden true
  #########
  children:
    #########################################################
    StartAddr:
      at:
        offset: 0x000
        nelms: *numBuffers
        stride: 8
      class: IntField
      name: StartAddr
      mode: RW
      sizeBits: 64
    #########################################################
    EndAddr:
      at:
        offset: 0x200
        nelms: *numBuffers
        stride: 8
      class: IntField
      name: EndAddr
      mode: RW
      sizeBits: 64
    #########################################################
    WrAddr:
      at:
        offset: 0x400
        nelms: *numBuffers
        stride: 8
      class: IntField
      name: WrAddr
      mode: RO
      sizeBits: 64
    #########################################################
    TriggerAddr:
      at:
        offset: 0x600
        nelms: *numBuffers
        stride: 8
      class: IntField
      name: TriggerAddr
      mode: RO
      sizeBits: 64
    #########################################################
    Enabled:
      at:
        offset: 0x800
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Enabled
      mode: RW
      lsBit: 0
      sizeBits: 1
    #########################################################
    Mode:
      at:
        offset: 0x800
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Mode
      mode: RW
      lsBit: 1
      sizeBits: 1
      enums:
        - name: Wrap
          class: Enum
          value: 0
        - name: DoneWhenFull
          class: Enum
          value: 1
    ##########################################################
    Init:
      at:
        offset: 0x800
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Init
      mode: RW
      lsBit: 2
      sizeBits: 1
      hidden: true
    #########################################################
    SoftTrigger:
      at:
        offset: 0x800
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: SoftTrigger
      mode: RW
      lsBit: 3
      sizeBits: 1
      hidden: true
    #########################################################
    MsgDest:
      at:
        offset: 0x800
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: MsgDest
      mode: RW
      lsBit: 4
      sizeBits: 4
      enums: *destEnums
      hidden: true
    #########################################################
    FramesAfterTrigger:
      at:
        offset: 0x802
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: FramesAfterTrigger
      mode: RW
      lsBit: 0
      sizeBits: 16
    #########################################################
    Status:
      at:
        offset: 0xA00
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Status
      mode: RO
      sizeBits: 32
      lsBit: 0
      description: Include all of the status bits in one access
    #########################################################
    Empty:
      at:
        offset: 0xA00
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Empty
      mode: RO
      sizeBits: 1
      lsBit: 0
    #########################################################
    Full:
      at:
        offset: 0xA00
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Full
      mode: RO
      sizeBits: 1
      lsBit: 1
    #########################################################
    Done:
      at:
        offset: 0xA00
        stride: 4
        nelms: *numBuffers
      class: IntField
      name: Done
      mode: RO
      sizeBits: 1
      lsBit: 2
    #########################################################
    Triggered:
      at:
        offset: 0xA00
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Triggered
      mode: RO
      sizeBits: 1
      lsBit: 3
    #########################################################
    Error:
      at:
        offset: 0xA00
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: Error
      mode: RO
      sizeBits: 1
      lsBit: 4
    #########################################################
    BurstSize:
      at:
        offset: 0xA01 # Same constant value for every buffer so only define one
      class: IntField
      name: BurstSize
      mode: RO
      sizeBits: 4
      lsBit: 0
    #########################################################
    FramesSinceTrigger:
      at:
        offset: 0xA02
        nelms: *numBuffers
        stride: 4
      class: IntField
      name: FramesSinceTrigger
      mode: RO
      sizeBits: 16
      lsBit: 0
    #########################################################
    Initialize:
      name: Initialize
      class: SequenceCommand
      at:
        offset: 0x0
      description: "Initialize the buffer. Reset the write pointer to StartAddr. Clear the Done field."
      nelms: *numBuffers
      sequence:
      - entry: Init[0]
        value: 0x1
      - entry: Init[1]
        value: 0x1
      - entry: Init[2]
        value: 0x1
      - entry: Init[3]
        value: 0x1
      - entry: Init[0]
        value: 0x0
      - entry: Init[1]
        value: 0x0
      - entry: Init[2]
        value: 0x0
      - entry: Init[3]
        value: 0x0
    #########################################################
    C_SoftTrigger:
      name: C_SoftTrigger
      class: SequenceCommand
      at:
        offset: 0x0
      description: Send a trigger to the buffer
      nelms: *numBuffers
      sequence:
      - entry: SoftTrigger
        value: 0x1
      - entry: SoftTrigger
        value: 0x0
    #########################################################
    SoftTriggerAll:
      name: SoftTriggerAll
      class: SequenceCommand
      at:
        offset: 0x0
      description: Send a trigger to the buffer
      sequence:
      - entry: SoftTrigger
        value: 1
