Skip to content

Commit dbc4791

Browse files
committed
Libarchfpga: add internal falling edge clocked .latch model
Signed-off-by: Pawel Czarnecki <pczarnecki@antmicro.com>
1 parent cd6ff36 commit dbc4791

File tree

1 file changed

+59
-12
lines changed

1 file changed

+59
-12
lines changed

libs/libarchfpga/src/arch_util.cpp

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ void free_arch(t_arch* arch) {
172172
vtr::free(arch->architecture_id);
173173

174174
if (arch->model_library) {
175-
for (int i = 0; i < 4; ++i) {
175+
for (int i = 0; i < 5; ++i) {
176176
vtr::t_linked_vptr* vptr = arch->model_library[i].pb_types;
177177
while (vptr) {
178178
vtr::t_linked_vptr* vptr_prev = vptr;
@@ -194,10 +194,16 @@ void free_arch(t_arch* arch) {
194194
vtr::free(arch->model_library[2].outputs->name);
195195
delete[] arch->model_library[2].outputs;
196196
vtr::free(arch->model_library[3].name);
197-
vtr::free(arch->model_library[3].inputs->name);
197+
vtr::free(arch->model_library[3].inputs[0].name);
198+
vtr::free(arch->model_library[3].inputs[1].name);
198199
delete[] arch->model_library[3].inputs;
199200
vtr::free(arch->model_library[3].outputs->name);
200201
delete[] arch->model_library[3].outputs;
202+
vtr::free(arch->model_library[4].name);
203+
vtr::free(arch->model_library[4].inputs->name);
204+
delete[] arch->model_library[4].inputs;
205+
vtr::free(arch->model_library[4].outputs->name);
206+
delete[] arch->model_library[4].outputs;
201207
delete[] arch->model_library;
202208
}
203209

@@ -1002,7 +1008,7 @@ e_power_estimation_method power_method_inherited(e_power_estimation_method paren
10021008
void CreateModelLibrary(t_arch* arch) {
10031009
t_model* model_library;
10041010

1005-
model_library = new t_model[4];
1011+
model_library = new t_model[5];
10061012

10071013
//INPAD
10081014
model_library[0].name = vtr::strdup(MODEL_INPUT);
@@ -1034,7 +1040,7 @@ void CreateModelLibrary(t_arch* arch) {
10341040
model_library[1].next = &model_library[2];
10351041
model_library[1].outputs = nullptr;
10361042

1037-
//LATCH
1043+
//LATCH triggered at RISING EDGE
10381044
model_library[2].name = vtr::strdup(MODEL_LATCH);
10391045
model_library[2].index = 2;
10401046
model_library[2].inputs = new t_model_ports[2];
@@ -1047,6 +1053,7 @@ void CreateModelLibrary(t_arch* arch) {
10471053
model_library[2].inputs[0].index = 0;
10481054
model_library[2].inputs[0].is_clock = false;
10491055
model_library[2].inputs[0].clock = "clk";
1056+
model_library[2].inputs[0].trigg_edge = TriggeringEdge::RISING_EDGE;
10501057

10511058
model_library[2].inputs[1].dir = IN_PORT;
10521059
model_library[2].inputs[1].name = vtr::strdup("clk");
@@ -1055,6 +1062,7 @@ void CreateModelLibrary(t_arch* arch) {
10551062
model_library[2].inputs[1].min_size = 1;
10561063
model_library[2].inputs[1].index = 0;
10571064
model_library[2].inputs[1].is_clock = true;
1065+
model_library[2].inputs[1].trigg_edge = TriggeringEdge::RISING_EDGE;
10581066

10591067
model_library[2].instances = nullptr;
10601068
model_library[2].next = &model_library[3];
@@ -1068,32 +1076,71 @@ void CreateModelLibrary(t_arch* arch) {
10681076
model_library[2].outputs[0].index = 0;
10691077
model_library[2].outputs[0].is_clock = false;
10701078
model_library[2].outputs[0].clock = "clk";
1079+
model_library[2].outputs[0].trigg_edge = TriggeringEdge::RISING_EDGE;
10711080

1072-
//NAMES
1073-
model_library[3].name = vtr::strdup(MODEL_NAMES);
1081+
//LATCH triggered at FALLING EDGE
1082+
model_library[3].name = vtr::strdup(MODEL_LATCH);
10741083
model_library[3].index = 3;
1084+
model_library[3].inputs = new t_model_ports[2];
10751085

1076-
model_library[3].inputs = new t_model_ports[1];
10771086
model_library[3].inputs[0].dir = IN_PORT;
1078-
model_library[3].inputs[0].name = vtr::strdup("in");
1079-
model_library[3].inputs[0].next = nullptr;
1087+
model_library[3].inputs[0].name = vtr::strdup("D");
1088+
model_library[3].inputs[0].next = &model_library[3].inputs[1];
10801089
model_library[3].inputs[0].size = 1;
10811090
model_library[3].inputs[0].min_size = 1;
10821091
model_library[3].inputs[0].index = 0;
10831092
model_library[3].inputs[0].is_clock = false;
1084-
model_library[3].inputs[0].combinational_sink_ports = {"out"};
1093+
model_library[3].inputs[0].clock = "clk";
1094+
model_library[3].inputs[0].trigg_edge = TriggeringEdge::FALLING_EDGE;
1095+
1096+
model_library[3].inputs[1].dir = IN_PORT;
1097+
model_library[3].inputs[1].name = vtr::strdup("clk");
1098+
model_library[3].inputs[1].next = nullptr;
1099+
model_library[3].inputs[1].size = 1;
1100+
model_library[3].inputs[1].min_size = 1;
1101+
model_library[3].inputs[1].index = 0;
1102+
model_library[3].inputs[1].is_clock = true;
1103+
model_library[3].inputs[1].trigg_edge = TriggeringEdge::FALLING_EDGE;
10851104

10861105
model_library[3].instances = nullptr;
1087-
model_library[3].next = nullptr;
1106+
model_library[3].next = &model_library[4];
10881107

10891108
model_library[3].outputs = new t_model_ports[1];
10901109
model_library[3].outputs[0].dir = OUT_PORT;
1091-
model_library[3].outputs[0].name = vtr::strdup("out");
1110+
model_library[3].outputs[0].name = vtr::strdup("Q");
10921111
model_library[3].outputs[0].next = nullptr;
10931112
model_library[3].outputs[0].size = 1;
10941113
model_library[3].outputs[0].min_size = 1;
10951114
model_library[3].outputs[0].index = 0;
10961115
model_library[3].outputs[0].is_clock = false;
1116+
model_library[3].outputs[0].clock = "clk";
1117+
model_library[3].outputs[0].trigg_edge = TriggeringEdge::FALLING_EDGE;
1118+
1119+
//NAMES
1120+
model_library[4].name = vtr::strdup(MODEL_NAMES);
1121+
model_library[4].index = 4;
1122+
1123+
model_library[4].inputs = new t_model_ports[1];
1124+
model_library[4].inputs[0].dir = IN_PORT;
1125+
model_library[4].inputs[0].name = vtr::strdup("in");
1126+
model_library[4].inputs[0].next = nullptr;
1127+
model_library[4].inputs[0].size = 1;
1128+
model_library[4].inputs[0].min_size = 1;
1129+
model_library[4].inputs[0].index = 0;
1130+
model_library[4].inputs[0].is_clock = false;
1131+
model_library[4].inputs[0].combinational_sink_ports = {"out"};
1132+
1133+
model_library[4].instances = nullptr;
1134+
model_library[4].next = nullptr;
1135+
1136+
model_library[4].outputs = new t_model_ports[1];
1137+
model_library[4].outputs[0].dir = OUT_PORT;
1138+
model_library[4].outputs[0].name = vtr::strdup("out");
1139+
model_library[4].outputs[0].next = nullptr;
1140+
model_library[4].outputs[0].size = 1;
1141+
model_library[4].outputs[0].min_size = 1;
1142+
model_library[4].outputs[0].index = 0;
1143+
model_library[4].outputs[0].is_clock = false;
10971144

10981145
arch->model_library = model_library;
10991146
}

0 commit comments

Comments
 (0)