44 class P3Atom :
public Atom< CoreConfig< P3Atom<PC>, PC> >
55 BITS = PC::BITS_PER_ATOM,
63 P3_TYPE_BITS_POS = P3_ECC_BITS_POS + P3_ECC_BITS_LEN,
64 P3_TYPE_BITS_LEN = 16,
66 P3_FIXED_HEADER_POS = P3_ECC_BITS_POS,
67 P3_FIXED_HEADER_LEN = P3_ECC_BITS_LEN + P3_TYPE_BITS_LEN,
69 P3_STATE_BITS_POS = P3_FIXED_HEADER_POS + P3_FIXED_HEADER_LEN,
70 P3_STATE_BITS_LEN = BITS - P3_STATE_BITS_POS,
74 ATOM_FIRST_STATE_BIT = P3_STATE_BITS_POS,
78 P3_TYPE_COUNT = 1<<P3_TYPE_BITS_LEN
92 void SetType(u32 type) {
94 if (type >= P3_TYPE_COUNT)
95 FAIL(ILLEGAL_ARGUMENT);
104 P3Atom(u32 type = 0, u32 z1 = 0, u32 z2 = 0, u32 stateBits = 0)
106 COMPILATION_REQUIREMENT< 32 <= BITS-1 >();
108 if (z1 != 0 || z2 != 0)
109 FAIL(ILLEGAL_ARGUMENT);
111 if (stateBits > P3_STATE_BITS_LEN)
117 u32 GetTypeImpl()
const {
121 bool IsSaneImpl()
const
127 bool HasBeenRepairedImpl()
133 if (repairedHeader == 0)
return false;
135 if (fixedHeader != repairedHeader)
144 u32 GetMaxStateSize(u32 type)
const {
145 return P3_STATE_BITS_LEN;
156 void WriteStateBitsImpl(
ByteSink& ostream)
const
158 for(u32 i = P3_STATE_BITS_POS; i < P3_STATE_BITS_POS + P3_STATE_BITS_LEN; i++)
164 void ReadStateBitsImpl(
const char* stateStr)
166 for(u32 i = 0; i < P3_STATE_BITS_LEN; i++)
168 this->
m_bits.
WriteBit(P3_STATE_BITS_POS + i, stateStr[i] ==
'0' ? 0 : 1);
172 void ReadStateBitsImpl(
const BitVector<BITS> & bv)
174 for(u32 i = 0; i < P3_STATE_BITS_LEN; i++)
176 u32 idx = P3_STATE_BITS_POS + i;
187 if (stateWidth > P3_STATE_BITS_LEN)
188 FAIL(ILLEGAL_ARGUMENT);
189 return this->
m_bits.
Read(P3_STATE_BITS_POS + stateIndex, stateWidth);
199 if (stateWidth > P3_STATE_BITS_LEN)
200 FAIL(ILLEGAL_ARGUMENT);
201 return this->
m_bits.
Write(P3_STATE_BITS_POS + stateIndex, stateWidth, value);
204 void PrintBits(
ByteSink & ostream)
const
207 void PrintImpl(ByteSink & ostream)
const
210 ostream.Printf(
"P3[%x/",type);
211 u32 length = GetMaxStateSize(type);
212 for (u32 i = 0; i < length; i += 4) {
214 ostream.Printf(
"%x",nyb);
219 P3Atom& operator=(
const P3Atom & rhs)
221 if (
this == &rhs)
return *
this;
223 this->
m_bits = rhs.m_bits;
static void Write(BV &bv, u32 val)
Definition: BitField.h:84
void Write(const u32 startIdx, const u32 length, const u32 value)
Definition: BitVector.tcc:99
void SetStateField(u32 stateIndex, u32 stateWidth, u32 value)
Definition: P3Atom.h:197
u32 GetType() const
Definition: Atom.h:178
static u32 Read(const BV &bv)
Definition: BitField.h:73
static u32 Add2DParity(u32 dataBits)
Definition: Parity2D_4x4.h:109
u32 Read(const u32 startIdx, const u32 length) const
Definition: BitVector.tcc:129
void WriteBit(u32 idx, bool bit)
Definition: BitVector.tcc:41
Definition: CoreConfig.h:40
void Print(ByteSink &ostream) const
Definition: BitVector.tcc:202
Definition: ByteSink.h:47
static u32 Correct2DParityIfPossible(u32 allBits)
Definition: Parity2D_4x4.cpp:18
bool ReadBit(u32 idx)
Definition: BitVector.tcc:65
u32 GetStateField(u32 stateIndex, u32 stateWidth) const
Definition: P3Atom.h:185
static bool Check2DParity(const u32 allBits)
Definition: Parity2D_4x4.h:145
BitVector< BPA > m_bits
Definition: Atom.h:99
u32 EndStateBit() const
Definition: P3Atom.h:151