2#include <block/cblock.h>
3#include <block/ctrlblock.h>
4#include <block/iblock.h>
5#include <block/mblock.h>
6#include <block/ublock.h>
8#include <entity/base.h>
19blocks::CBlock *blocks::CBlock::from_entity_classifier(entities::EntityClassifier classifier,
20 const bus::addr_t block_address) {
21 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
24 if (classifier.version < entities::Version(1, 0))
26 if (classifier.version < entities::Version(1, 1))
27 return new CBlock(
new CBlockHAL_V_1_0_X(block_address));
28 if (classifier.version < entities::Version(1, 2))
29 return new CBlock(
new CBlockHAL_V_1_1_X(block_address));
35FLASHMEM blocks::CTRLBlock *blocks::CTRLBlock::from_entity_classifier(entities::EntityClassifier classifier,
36 bus::addr_t block_address) {
37 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
43 return new CTRLBlock(
new CTRLBlockHAL_V_1_0_2(block_address));
46FLASHMEM blocks::IBlock *blocks::IBlock::from_entity_classifier(entities::EntityClassifier classifier,
47 bus::addr_t block_address) {
48 if (!classifier or classifier.class_enum != CLASS_)
52 if (classifier.variant != entities::EntityClassifier::DEFAULT_)
55 if (classifier.version < entities::Version(1, 2))
57 if (classifier.version < entities::Version(1, 3))
58 return new IBlock(
new IBlockHAL_V_1_2_X(block_address));
63blocks::MBlock *blocks::MBlock::from_entity_classifier(entities::EntityClassifier classifier,
64 const bus::addr_t block_address) {
65 if (!classifier or classifier.class_enum != entities::EntityClass::M_BLOCK)
68 auto type = classifier.type_as<TYPES>();
73 case TYPES::M_MUL4_BLOCK:
74 return MMulBlock::from_entity_classifier(classifier, block_address);
75 case TYPES::M_INT8_BLOCK:
76 return MIntBlock::from_entity_classifier(classifier, block_address);
83FLASHMEM blocks::MIntBlock *blocks::MIntBlock::from_entity_classifier(entities::EntityClassifier classifier,
84 const bus::addr_t block_address) {
85 if (!classifier or classifier.class_enum != CLASS_ or classifier.type !=
static_cast<uint8_t
>(TYPE))
89 if (classifier.variant != entities::EntityClassifier::DEFAULT_)
92 SLOT slot = block_address % 8 == 4 ? SLOT::M0 : SLOT::M1;
93 if (classifier.version < entities::Version(1))
95 if (classifier.version < entities::Version(1, 1))
96 return new MIntBlock(slot,
new MIntBlockHAL_V_1_0_X(block_address));
97 if (classifier.version < entities::Version(1, 2))
98 return new MIntBlock(slot,
new MIntBlockHAL_V_1_1_X(block_address));
102FLASHMEM blocks::MMulBlock *blocks::MMulBlock::from_entity_classifier(entities::EntityClassifier classifier,
103 const bus::addr_t block_address) {
104 if (!classifier or classifier.class_enum != CLASS_ or classifier.type !=
static_cast<uint8_t
>(TYPE))
108 if (classifier.variant != entities::EntityClassifier::DEFAULT_)
111 SLOT slot = block_address % 8 == 4 ? SLOT::M0 : SLOT::M1;
113 if (classifier.version < entities::Version(1))
115 if (classifier.version < entities::Version(1, 1))
116 return new MMulBlock(slot,
new MMulBlockHAL_V_1_0_X(block_address));
117 if (classifier.version == entities::Version(1, -1))
118 return new MMulBlock_FullAutoCalibration(slot,
new MMulBlockHAL_V_1_M1_X(block_address));
123blocks::SHBlock *blocks::SHBlock::from_entity_classifier(entities::EntityClassifier classifier,
124 bus::addr_t block_address) {
125 if (!classifier or classifier.class_enum != CLASS_)
129 if (classifier.variant != entities::EntityClassifier::DEFAULT_)
133 if (classifier.version < entities::Version(0, 1))
135 if (classifier.version < entities::Version(0, 2))
136 return new SHBlock(
new SHBlockHAL_V_1_0_X(block_address));
141blocks::UBlock *blocks::UBlock::from_entity_classifier(entities::EntityClassifier classifier,
142 bus::addr_t block_address) {
143 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
146 if (classifier.version < entities::Version(1, 2))
148 if (classifier.version < entities::Version(1, 3))
149 return new UBlock(
new UBlockHAL_V_1_2_X(block_address));