Skip to content

Commit

Permalink
Merge pull request #10239 from cms-l1t-offline/l1t-stage1unpacker-75x
Browse files Browse the repository at this point in the history
backport stage1 unpacker to 75x
  • Loading branch information
davidlange6 committed Jul 23, 2015
2 parents 60b4997 + 4e71757 commit 550fdc9
Show file tree
Hide file tree
Showing 67 changed files with 3,963 additions and 1,063 deletions.
88 changes: 88 additions & 0 deletions EventFilter/L1TRawToDigi/interface/AMC13Spec.h
@@ -0,0 +1,88 @@
#ifndef AMC13_SPEC__h
#define AMC13_SPEC__h

#include <memory>
#include <vector>
#include <stdint.h>

#include "AMCSpec.h"

namespace edm {
class Event;
}

namespace amc13 {
class Header {
public:
Header() : data_(0) {};
Header(const uint64_t *data) : data_(data[0]) {};
Header(unsigned int namc, unsigned int orbit);

inline uint64_t raw() const { return data_; };
bool check() const;

inline unsigned int getFormatVersion() const { return (data_ >> uFOV_shift) & uFOV_mask; };
inline unsigned int getNumberOfAMCs() const { return (data_ >> nAMC_shift) & nAMC_mask; };
inline unsigned int getOrbitNumber() const { return (data_ >> OrN_shift) & OrN_mask; };

private:
static const unsigned int uFOV_shift = 60;
static const unsigned int uFOV_mask = 0xf;
static const unsigned int nAMC_shift = 52;
static const unsigned int nAMC_mask = 0xf;
static const unsigned int OrN_shift = 4;
static const unsigned int OrN_mask = 0xffffffff;

static const unsigned int fov = 1;
static const unsigned int max_amc = 12;

uint64_t data_;
};

class Trailer {
public:
Trailer(const uint64_t *data) : data_(data[0]) {};
Trailer(unsigned int blk, unsigned int lv1, unsigned int bx);

inline unsigned int getCRC() const { return (data_ >> CRC_shift) & CRC_mask; };
inline unsigned int getBlock() const { return (data_ >> BlkNo_shift) & BlkNo_mask; };
inline unsigned int getLV1ID() const { return (data_ >> LV1_shift) & LV1_mask; };
inline unsigned int getBX() const { return (data_ >> BX_shift) & BX_mask; };

uint64_t raw() const { return data_; };
bool check(unsigned int crc, unsigned int block, unsigned int lv1_id, unsigned int bx) const;
static void writeCRC(const uint64_t *start, uint64_t *end);

private:
static const unsigned int CRC_shift = 32;
static const unsigned int CRC_mask = 0xffffffff;
static const unsigned int BlkNo_shift = 20;
static const unsigned int BlkNo_mask = 0xff;
static const unsigned int LV1_shift = 12;
static const unsigned int LV1_mask = 0xff;
static const unsigned int BX_shift = 0;
static const unsigned int BX_mask = 0xfff;

uint64_t data_;
};

class Packet {
public:
Packet() {};

unsigned int blocks() const;
unsigned int size() const;

void add(unsigned int amc_no, unsigned int board, unsigned int lv1id, unsigned int orbit, unsigned int bx, const std::vector<uint64_t>& load);
bool parse(const uint64_t *start, const uint64_t *data, unsigned int size, unsigned int lv1, unsigned int bx, bool legacy_mc=false);
bool write(const edm::Event& ev, unsigned char * ptr, unsigned int skip, unsigned int size) const;

inline std::vector<amc::Packet> payload() const { return payload_; };

private:
Header header_;
std::vector<amc::Packet> payload_;
};
}

#endif
136 changes: 70 additions & 66 deletions EventFilter/L1TRawToDigi/interface/AMCSpec.h
Expand Up @@ -5,20 +5,18 @@
#include <vector>
#include <stdint.h>

namespace edm {
class Event;
}

namespace amc {
static const unsigned int split_block_size = 0x1000;

class Header {
// The AMC header within an AMC13 payload block. Should optimally only
// be used when packing/unpacking AMC payloads into AMC13 blocks.
class BlockHeader {
public:
Header() : data_(0) {};
Header(const uint64_t *data) : data_(data[0]) {};
BlockHeader() : data_(0) {};
BlockHeader(const uint64_t *data) : data_(data[0]) {};
// size is the total size of the AMC payload, not just of the
// block
Header(unsigned int amc_no, unsigned int board_id, unsigned int size, unsigned int block=0);
BlockHeader(unsigned int amc_no, unsigned int board_id, unsigned int size, unsigned int block=0);

operator uint64_t() const { return data_; };

Expand All @@ -33,6 +31,8 @@ namespace amc {
inline unsigned int getMore() const { return (data_ >> More_bit_shift) & 1; };
inline unsigned int getSegmented() const { return (data_ >> Segmented_bit_shift) & 1; };

inline unsigned int validCRC() const { return (data_ >> CRC_bit_shift) & 1; };

private:
static const unsigned int Size_shift = 32;
static const unsigned int Size_mask = 0xffffff;
Expand All @@ -54,96 +54,100 @@ namespace amc {
uint64_t data_;
};

class Packet {
public:
Packet(const uint64_t* d) : header_(d) {};
Packet(unsigned int amc, unsigned int board, const std::vector<uint64_t>& load);

void addPayload(const uint64_t*, unsigned int);

std::vector<uint64_t> block(unsigned int id) const;
std::unique_ptr<uint64_t[]> data();
Header header(unsigned int block=0) const { return header_; };

inline unsigned int blocks() const { return header_.getBlocks(); };
inline unsigned int size() const { return header_.getSize(); };

private:
Header header_;
std::vector<uint64_t> payload_;
};
}

namespace amc13 {
// The actual header attached to the AMC payload, also contained in the
// AMC payload of an AMC13 packet/block.
class Header {
public:
Header() : data_(0) {};
Header(const uint64_t *data) : data_(data[0]) {};
Header(unsigned int namc, unsigned int orbit);

bool valid();
Header() : data0_(0), data1_(0) {};
Header(const uint64_t *data) : data0_(data[0]), data1_(data[1]) {};
Header(unsigned int amc_no, unsigned int lv1_id, unsigned int bx_id, unsigned int size,
unsigned int or_n, unsigned int board_id, unsigned int user);

inline uint64_t raw() const { return data_; };
inline unsigned int getAMCNumber() const { return (data0_ >> AmcNo_shift) & AmcNo_mask; };
inline unsigned int getBoardID() const { return (data1_ >> BoardID_shift) & BoardID_mask; };
inline unsigned int getLV1ID() const { return (data0_ >> LV1ID_shift) & LV1ID_mask; };
inline unsigned int getBX() const { return (data0_ >> BX_shift) & BX_mask; };
inline unsigned int getOrbitNumber() const { return (data1_ >> OrN_shift) & OrN_mask; };
inline unsigned int getSize() const { return (data0_ >> Size_shift) & Size_mask; };
inline unsigned int getUserData() const { return (data1_ >> User_shift) & User_mask; };

inline unsigned int getFormatVersion() const { return (data_ >> uFOV_shift) & uFOV_mask; };
inline unsigned int getNumberOfAMCs() const { return (data_ >> nAMC_shift) & nAMC_mask; };
inline unsigned int getOrbitNumber() const { return (data_ >> OrN_shift) & OrN_mask; };
std::vector<uint64_t> raw() const { return {data0_, data1_}; };

private:
static const unsigned int uFOV_shift = 60;
static const unsigned int uFOV_mask = 0xf;
static const unsigned int nAMC_shift = 52;
static const unsigned int nAMC_mask = 0xf;
static const unsigned int OrN_shift = 4;
static const unsigned int OrN_mask = 0xffffffff;
static const unsigned int Size_shift = 0;
static const unsigned int Size_mask = 0xfffff;
static const unsigned int BX_shift = 20;
static const unsigned int BX_mask = 0xfff;
static const unsigned int LV1ID_shift = 32;
static const unsigned int LV1ID_mask = 0xffffff;
static const unsigned int AmcNo_shift = 56;
static const unsigned int AmcNo_mask = 0xf;

static const unsigned int fov = 1;
static const unsigned int max_amc = 12;
static const unsigned int BoardID_shift = 0;
static const unsigned int BoardID_mask = 0xffff;
static const unsigned int OrN_shift = 16;
static const unsigned int OrN_mask = 0xffff;
static const unsigned int User_shift = 32;
static const unsigned int User_mask = 0xffffffff;

uint64_t data_;
uint64_t data0_;
uint64_t data1_;
};

class Trailer {
public:
Trailer() : data_(0) {};
Trailer(const uint64_t *data) : data_(data[0]) {};
Trailer(unsigned int crc, unsigned int blk, unsigned int lv1, unsigned int bx);
Trailer(unsigned int crc, unsigned int lv1_id, unsigned int size);

inline unsigned int getCRC() const { return (data_ >> CRC_shift) & CRC_mask; };
inline unsigned int getBlock() const { return (data_ >> BlkNo_shift) & BlkNo_mask; };
inline unsigned int getLV1ID() const { return (data_ >> LV1_shift) & LV1_mask; };
inline unsigned int getBX() const { return (data_ >> BX_shift) & BX_mask; };
inline unsigned int getLV1ID() const { return (data_ >> LV1ID_shift) & LV1ID_mask; };
inline unsigned int getSize() const { return (data_ >> Size_shift) & Size_mask; };

uint64_t raw() const { return data_; };
uint64_t raw() const { return data_; }
bool check(unsigned int crc, unsigned int lv1_id, unsigned int size) const;

static void writeCRC(const uint64_t *start, uint64_t *end);

private:
static const unsigned int Size_shift = 0;
static const unsigned int Size_mask = 0xfffff;
static const unsigned int LV1ID_shift = 24;
static const unsigned int LV1ID_mask = 0xff;
static const unsigned int CRC_shift = 32;
static const unsigned int CRC_mask = 0xffffffff;
static const unsigned int BlkNo_shift = 20;
static const unsigned int BlkNo_mask = 0xff;
static const unsigned int LV1_shift = 12;
static const unsigned int LV1_mask = 0xff;
static const unsigned int BX_shift = 0;
static const unsigned int BX_mask = 0xfff;

uint64_t data_;
};

class Packet {
public:
Packet() {};
Packet(const uint64_t* d) : block_header_(d) {};
Packet(unsigned int amc, unsigned int board, unsigned int lv1id, unsigned int orbit, unsigned int bx, const std::vector<uint64_t>& load);

unsigned int blocks() const;
unsigned int size() const;
// Add payload fragment from an AMC13 block to the AMC packet
void addPayload(const uint64_t*, unsigned int);
// To be called after the last payload addition. Removes header
// and trailer from the actual paylod. Also performs
// cross-checks for data consistency.
void finalize(unsigned int lv1, unsigned int bx, bool legacy_mc=false);

void add(unsigned int amc_no, unsigned int board, const std::vector<uint64_t>& load);
bool parse(const uint64_t*, unsigned int);
bool write(const edm::Event& ev, unsigned char * ptr, unsigned int size) const;
std::vector<uint64_t> block(unsigned int id) const;
std::unique_ptr<uint64_t[]> data();
BlockHeader blockHeader(unsigned int block=0) const { return block_header_; };
Header header() const { return header_; };
Trailer trailer() const { return trailer_; };

inline std::vector<amc::Packet> payload() const { return payload_; };
inline unsigned int blocks() const { return block_header_.getBlocks(); };
// Returns the size of the payload _without_ the headers
inline unsigned int size() const { return payload_.size() - 3; };

private:
BlockHeader block_header_;
Header header_;
std::vector<amc::Packet> payload_;
Trailer trailer_;

std::vector<uint64_t> payload_;
};
}

Expand Down
24 changes: 15 additions & 9 deletions EventFilter/L1TRawToDigi/interface/Block.h
Expand Up @@ -11,16 +11,17 @@ namespace l1t {

class BlockHeader {
public:
BlockHeader(unsigned int id, unsigned int size, block_t type=MP7) : id_(id), size_(size), type_(type) {};
BlockHeader(unsigned int id, unsigned int size, unsigned int capID=0, block_t type=MP7) : id_(id), size_(size), capID_(capID), type_(type) {};
// Create a MP7 block header: everything is contained in the raw uint32
BlockHeader(const uint32_t *data) : id_((data[0] >> ID_shift) & ID_mask), size_((data[0] >> size_shift) & size_mask), type_(MP7) {};
BlockHeader(const uint32_t *data) : id_((data[0] >> ID_shift) & ID_mask), size_((data[0] >> size_shift) & size_mask), capID_((data[0] >> capID_shift) & capID_mask), type_(MP7) {};
// Create a CTP7 block header: size is contained in the general CTP7 header
BlockHeader(const uint32_t *data, unsigned int size) : id_((data[0] >> CTP7_shift) & CTP7_mask), size_(size), type_(CTP7) {};
BlockHeader(const uint32_t *data, unsigned int size) : id_((data[0] >> CTP7_shift) & CTP7_mask), size_(size), capID_(0), type_(CTP7) {};

bool operator<(const BlockHeader& o) const { return getID() < o.getID(); };

unsigned int getID() const { return id_; };
unsigned int getSize() const { return size_; };
unsigned int getCapID() const { return capID_; };
block_t getType() const { return type_; };

uint32_t raw(block_t type=MP7) const;
Expand All @@ -32,18 +33,21 @@ namespace l1t {
static const unsigned int ID_mask = 0xff;
static const unsigned int size_shift = 16;
static const unsigned int size_mask = 0xff;
static const unsigned int capID_shift = 8;
static const unsigned int capID_mask = 0xff;

unsigned int id_;
unsigned int size_;
unsigned int capID_;
block_t type_;
};

class Block {
public:
Block(const BlockHeader& h, const uint32_t * payload_start, const uint32_t * payload_end) :
header_(h), payload_(payload_start, payload_end) {};
Block(unsigned int id, const std::vector<uint32_t>& payload, block_t type=MP7) :
header_(id, payload.size(), type), payload_(payload) {};
Block(unsigned int id, const std::vector<uint32_t>& payload, unsigned int capID=0, block_t type=MP7) :
header_(id, payload.size(), capID, type), payload_(payload) {};

bool operator<(const Block& o) const { return header() < o.header(); };

Expand All @@ -65,9 +69,10 @@ namespace l1t {

class Payload {
public:
Payload(const uint32_t * data, const uint32_t * end) : data_(data), end_(end), fw_(0) {};
Payload(const uint32_t * data, const uint32_t * end) : data_(data), end_(end), algo_(0), infra_(0) {};

unsigned getFirmwareId() const { return fw_; };
virtual unsigned getAlgorithmFWVersion() const { return algo_; };
virtual unsigned getInfrastructureFWVersion() const { return infra_; };
virtual unsigned getHeaderSize() const = 0;
// Read header from data_ and advance data_ to point behind the
// header. Called by getBlock(), which also checks that data_ !=
Expand All @@ -78,12 +83,13 @@ namespace l1t {
const uint32_t * data_;
const uint32_t * end_;

unsigned fw_;
unsigned algo_;
unsigned infra_;
};

class MP7Payload : public Payload {
public:
MP7Payload(const uint32_t * data, const uint32_t * end);
MP7Payload(const uint32_t * data, const uint32_t * end, bool legacy_mc=false);
virtual unsigned getHeaderSize() const override { return 1; };
virtual BlockHeader getHeader() override;
};
Expand Down

0 comments on commit 550fdc9

Please sign in to comment.