Skip to content

Commit 97c5cb0

Browse files
committed
Libarchfpga: add internal falling edge clocked .latch model
Signed-off-by: Pawel Czarnecki <[email protected]>
1 parent e5f2d07 commit 97c5cb0

File tree

1 file changed

+54
-11
lines changed

1 file changed

+54
-11
lines changed

libs/libarchfpga/src/arch_util.cpp

Lines changed: 54 additions & 11 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;
@@ -198,6 +198,12 @@ void free_arch(t_arch* arch) {
198198
delete[] arch->model_library[3].inputs;
199199
vtr::free(arch->model_library[3].outputs->name);
200200
delete[] arch->model_library[3].outputs;
201+
vtr::free(arch->model_library[4].name);
202+
vtr::free(arch->model_library[4].inputs[0].name);
203+
vtr::free(arch->model_library[4].inputs[1].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];
@@ -1055,6 +1061,7 @@ void CreateModelLibrary(t_arch* arch) {
10551061
model_library[2].inputs[1].min_size = 1;
10561062
model_library[2].inputs[1].index = 0;
10571063
model_library[2].inputs[1].is_clock = true;
1064+
model_library[2].inputs[1].trigg_edge = TriggeringEdge::RISING_EDGE;
10581065

10591066
model_library[2].instances = nullptr;
10601067
model_library[2].next = &model_library[3];
@@ -1069,31 +1076,67 @@ void CreateModelLibrary(t_arch* arch) {
10691076
model_library[2].outputs[0].is_clock = false;
10701077
model_library[2].outputs[0].clock = "clk";
10711078

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

1076-
model_library[3].inputs = new t_model_ports[1];
10771084
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;
1085+
model_library[3].inputs[0].name = vtr::strdup("D");
1086+
model_library[3].inputs[0].next = &model_library[3].inputs[1];
10801087
model_library[3].inputs[0].size = 1;
10811088
model_library[3].inputs[0].min_size = 1;
10821089
model_library[3].inputs[0].index = 0;
10831090
model_library[3].inputs[0].is_clock = false;
1084-
model_library[3].inputs[0].combinational_sink_ports = {"out"};
1091+
model_library[3].inputs[0].clock = "clk";
1092+
1093+
model_library[3].inputs[1].dir = IN_PORT;
1094+
model_library[3].inputs[1].name = vtr::strdup("clk");
1095+
model_library[3].inputs[1].next = nullptr;
1096+
model_library[3].inputs[1].size = 1;
1097+
model_library[3].inputs[1].min_size = 1;
1098+
model_library[3].inputs[1].index = 0;
1099+
model_library[3].inputs[1].is_clock = true;
1100+
model_library[3].inputs[1].trigg_edge = TriggeringEdge::FALLING_EDGE;
10851101

10861102
model_library[3].instances = nullptr;
1087-
model_library[3].next = nullptr;
1103+
model_library[3].next = &model_library[4];
10881104

10891105
model_library[3].outputs = new t_model_ports[1];
10901106
model_library[3].outputs[0].dir = OUT_PORT;
1091-
model_library[3].outputs[0].name = vtr::strdup("out");
1107+
model_library[3].outputs[0].name = vtr::strdup("Q");
10921108
model_library[3].outputs[0].next = nullptr;
10931109
model_library[3].outputs[0].size = 1;
10941110
model_library[3].outputs[0].min_size = 1;
10951111
model_library[3].outputs[0].index = 0;
10961112
model_library[3].outputs[0].is_clock = false;
1113+
model_library[3].outputs[0].clock = "clk";
1114+
1115+
//NAMES
1116+
model_library[4].name = vtr::strdup(MODEL_NAMES);
1117+
model_library[4].index = 4;
1118+
1119+
model_library[4].inputs = new t_model_ports[1];
1120+
model_library[4].inputs[0].dir = IN_PORT;
1121+
model_library[4].inputs[0].name = vtr::strdup("in");
1122+
model_library[4].inputs[0].next = nullptr;
1123+
model_library[4].inputs[0].size = 1;
1124+
model_library[4].inputs[0].min_size = 1;
1125+
model_library[4].inputs[0].index = 0;
1126+
model_library[4].inputs[0].is_clock = false;
1127+
model_library[4].inputs[0].combinational_sink_ports = {"out"};
1128+
1129+
model_library[4].instances = nullptr;
1130+
model_library[4].next = nullptr;
1131+
1132+
model_library[4].outputs = new t_model_ports[1];
1133+
model_library[4].outputs[0].dir = OUT_PORT;
1134+
model_library[4].outputs[0].name = vtr::strdup("out");
1135+
model_library[4].outputs[0].next = nullptr;
1136+
model_library[4].outputs[0].size = 1;
1137+
model_library[4].outputs[0].min_size = 1;
1138+
model_library[4].outputs[0].index = 0;
1139+
model_library[4].outputs[0].is_clock = false;
10971140

10981141
arch->model_library = model_library;
10991142
}

0 commit comments

Comments
 (0)