add check codes for physical pb_type circuit model annotation

This commit is contained in:
tangxifan 2020-01-29 12:56:49 -07:00
parent a722438fa3
commit b67358d2c5
1 changed files with 99 additions and 1 deletions

View File

@ -1011,6 +1011,103 @@ void link_vpr_pb_interconnect_to_circuit_model_implicit_annotation(const DeviceC
}
}
/********************************************************************
* This function will recursively traverse only the physical mode
* and physical pb_types in the graph to ensure
* - Every physical pb_type should be linked to a valid circuit model
* - Every port of the pb_type have been linked to a valid port of a circuit model
* - Every interconnect has been linked to a valid circuit model
* in a correct type
*******************************************************************/
static
void rec_check_vpr_pb_type_circuit_model_annotation(t_pb_type* cur_pb_type,
const CircuitLibrary& circuit_lib,
const VprPbTypeAnnotation& vpr_pb_type_annotation,
size_t& num_err) {
/* Primitive pb_type should always been binded to a physical pb_type */
if (true == is_primitive_pb_type(cur_pb_type)) {
/* Every physical pb_type should be linked to a valid circuit model */
if (CircuitModelId::INVALID() == vpr_pb_type_annotation.pb_type_circuit_model(cur_pb_type)) {
VTR_LOG_ERROR("Found a physical pb_type '%s' missing circuit model binding!\n",
cur_pb_type->name);
num_err++;
return; /* Invalid id already, further check is not applicable */
}
/* Every port of the pb_type have been linked to a valid port of a circuit model */
for (t_port* port : pb_type_ports(cur_pb_type)) {
if (CircuitPortId::INVALID() == vpr_pb_type_annotation.pb_circuit_port(port)) {
VTR_LOG_ERROR("Found a port '%s' of physical pb_type '%s' missing circuit port binding!\n",
port->name, cur_pb_type->name);
num_err++;
}
}
return;
}
/* Every interconnect in the physical mode has been linked to a valid circuit model in a correct type */
t_mode* physical_mode = vpr_pb_type_annotation.physical_mode(cur_pb_type);
for (t_interconnect* interc : pb_mode_interconnects(physical_mode)) {
CircuitModelId interc_circuit_model = vpr_pb_type_annotation.interconnect_circuit_model(interc);
if (CircuitModelId::INVALID() == interc_circuit_model) {
VTR_LOG_ERROR("Found an interconnect '%s' under physical mode '%s' of pb_type '%s' missing circuit model binding!\n",
interc->name,
physical_mode->name,
cur_pb_type->name);
num_err++;
continue;
}
e_circuit_model_type required_circuit_model_type = pb_interconnect_require_circuit_model_type(vpr_pb_type_annotation.interconnect_physical_type(interc));
if (circuit_lib.model_type(interc_circuit_model) != required_circuit_model_type) {
VTR_LOG_ERROR("Found an interconnect '%s' under physical mode '%s' of pb_type '%s' linked to a circuit model '%s' with a wrong type!\nExpect: '%s' Linked: '%s'\n",
interc->name,
physical_mode->name,
cur_pb_type->name,
circuit_lib.model_name(interc_circuit_model).c_str(),
CIRCUIT_MODEL_TYPE_STRING[circuit_lib.model_type(interc_circuit_model)],
CIRCUIT_MODEL_TYPE_STRING[required_circuit_model_type]);
num_err++;
}
}
/* Traverse only the physical mode */
for (int ichild = 0; ichild < physical_mode->num_pb_type_children; ++ichild) {
rec_check_vpr_pb_type_circuit_model_annotation(&(physical_mode->pb_type_children[ichild]),
circuit_lib,
vpr_pb_type_annotation,
num_err);
}
}
/********************************************************************
* This function will check the circuit model annotation for
* each physical pb_type in the device
* - Every physical pb_type should be linked to a valid circuit model
* - Every port of the pb_type have been linked a valid port of a circuit model
* - Every interconnect has been linked to a valid circuit model
* in a correct type
*******************************************************************/
static
void check_vpr_pb_type_circuit_model_annotation(const DeviceContext& vpr_device_ctx,
const CircuitLibrary& circuit_lib,
const VprPbTypeAnnotation& vpr_pb_type_annotation) {
size_t num_err = 0;
for (const t_logical_block_type& lb_type : vpr_device_ctx.logical_block_types) {
/* By pass nullptr for pb_type head */
if (nullptr == lb_type.pb_type) {
continue;
}
/* Top pb_type should always has a physical mode! */
rec_check_vpr_pb_type_circuit_model_annotation(lb_type.pb_type, circuit_lib, vpr_pb_type_annotation, num_err);
}
if (0 == num_err) {
VTR_LOG("Check physical pb_type annotation for circuit model passed.\n");
} else {
VTR_LOG_ERROR("Check physical pb_type annotation for circuit model failed with %ld errors!\n",
num_err);
}
}
/********************************************************************
* This function will bind mode selection bits to a primitive pb_type
* in the vpr_pb_type_annotation
@ -1178,7 +1275,8 @@ void annotate_pb_types(const DeviceContext& vpr_device_ctx,
vpr_pb_type_annotation);
link_vpr_pb_interconnect_to_circuit_model_implicit_annotation(vpr_device_ctx, openfpga_arch.circuit_lib,
vpr_pb_type_annotation);
/* TODO: check the circuit model annotation */
check_vpr_pb_type_circuit_model_annotation(vpr_device_ctx, openfpga_arch.circuit_lib,
const_cast<const VprPbTypeAnnotation&>(vpr_pb_type_annotation));
/* Link physical pb_type to mode_bits */
VTR_LOG("\n");