39 #define P0ATOM_HEADER_LENGTH_SIZE 2
40 #define P0ATOM_TYPE_WIDTH_INCREMENT 12
41 #define P0ATOM_STATE_SIZE 48
47 class P0Atom :
public Atom< CoreConfig< P0Atom<PC>, PC> >
53 ATOM_FIRST_STATE_BIT = 0
59 enum { BPA = P::BITS_PER_ATOM };
66 CONFIGURED_BITS_PER_ATOM_IS_INCOMPATIBLE_WITH_P0ATOM = 1/((PC::BITS_PER_ATOM==BITS)?1:0)
71 TYPE0_LENGTH = 0*P0ATOM_TYPE_WIDTH_INCREMENT,
72 TYPE1_LENGTH = 1*P0ATOM_TYPE_WIDTH_INCREMENT,
73 TYPE2_LENGTH = 2*P0ATOM_TYPE_WIDTH_INCREMENT,
97 void SetType(u32 lengthCode, u32 type)
107 FAIL(ILLEGAL_ARGUMENT);
111 u32 GetLengthCodeForType(u32 type)
113 if ((1 << TYPE0_LENGTH) > type)
return 0;
114 if ((1 << TYPE1_LENGTH) > type)
return 1;
115 if ((1 << TYPE2_LENGTH) > type)
return 2;
116 if ((1 << TYPE3_LENGTH) > type)
return 3;
117 FAIL(ILLEGAL_ARGUMENT);
133 return AFTypeLength0::START;
135 return AFTypeLength1::START;
137 return AFTypeLength2::START;
139 return AFTypeLength3::START;
141 FAIL(ILLEGAL_ARGUMENT);
147 bool IsSaneImpl()
const
153 bool HasBeenRepairedImpl()
159 u32 GetTypeImpl()
const
162 switch (lengthCode) {
168 FAIL(UNREACHABLE_CODE);
179 const u32 firstState = ATOM_FIRST_STATE_BIT + stateIndex;
181 if (firstState + stateWidth >= lastState)
182 FAIL(ILLEGAL_ARGUMENT);
184 return this->
m_bits.
Read(firstState, stateWidth);
195 const u32 firstState = ATOM_FIRST_STATE_BIT + stateIndex;
197 if (firstState + stateWidth >= lastState)
198 FAIL(ILLEGAL_ARGUMENT);
200 return this->
m_bits.
Write(firstState, stateWidth, value);
203 void WriteStateBitsImpl(
ByteSink& ostream)
const
207 for(u32 i = ATOM_FIRST_STATE_BIT; i < endStateBit; i++)
213 void ReadStateBitsImpl(
const char* stateStr)
217 for(u32 i = ATOM_FIRST_STATE_BIT; i < endStateBit; i++)
223 void ReadStateBitsImpl(
const BitVector<BITS> & bv)
227 for(u32 i = ATOM_FIRST_STATE_BIT; i < endStateBit; i++)
233 static u32 GetMaxStateSize(u32 lengthCode) {
237 P0Atom(u32 type = 0, u32 longc = 0, u32 shortc = 0, u32 statec = 0)
239 InitAtom(type,longc,shortc,statec);
242 void InitAtom(u32 type, u32 longc, u32 shortc, u32 statec)
245 FAIL(ILLEGAL_ARGUMENT);
247 FAIL(ILLEGAL_ARGUMENT);
250 GetLengthCodeForType(type);
252 GetMaxStateSize(lengthCode);
254 if (statec > maxState)
255 FAIL(ILLEGAL_ARGUMENT);
257 SetType(lengthCode, type);
261 void PrintBits(ByteSink & ostream)
const
264 void PrintImpl(ByteSink & ostream)
const
268 ostream.Printf(
"P0[%x/",type);
269 u32 length = GetMaxStateSize(lengthCode);
270 for (
int i = 0; i < length; i += 4) {
271 u32 nyb = this->
m_bits.
Read(ATOM_FIRST_STATE_BIT+i,4);
272 ostream.Printf(
"%x",nyb);
277 P0Atom& operator=(
const P0Atom & rhs);
281 #include "P0Atom.tcc"
static void Write(BV &bv, u32 val)
Definition: BitField.h:84
u32 EndStateBit() const
Definition: P0Atom.h:123
P PARAM_CONFIG
Definition: CoreConfig.h:51
void Write(const u32 startIdx, const u32 length, const u32 value)
Definition: BitVector.tcc:99
u32 GetType() const
Definition: Atom.h:178
static u32 Read(const BV &bv)
Definition: BitField.h:73
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
bool ReadBit(u32 idx)
Definition: BitVector.tcc:65
void SetStateField(u32 stateIndex, u32 stateWidth, u32 value)
Definition: P0Atom.h:192
BitVector< BPA > m_bits
Definition: Atom.h:99
u32 GetStateField(u32 stateIndex, u32 stateWidth) const
Definition: P0Atom.h:176