Skip to content

Commit 165b1da

Browse files
committed
Densify source lists, fix issues with cmuxh
1 parent 95838c5 commit 165b1da

File tree

8 files changed

+101
-23
lines changed

8 files changed

+101
-23
lines changed

data/cmuxh-mux.txt

+5-6
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,15 @@ g burst_count_ctrl m:1 116 | 130 | 240 | 233
124124
0 static !
125125
1 core_ctrl
126126
g burst_count r-:3 129 122 136 | 117 137 123 | 232 246 226 | 241 227 247
127-
X iclk_sel r+:5
128-
* 179 193 173 187 180
129-
* 194 174 188 181 195
130-
* 176 183 169 189 175
131-
* 160 153 167 168 182
132-
Y iclk_sel r+:5
127+
r iclk_sel r+:5
133128
* 33 53 40 47 39
134129
* 45 38 52 32 46
135130
* 48 41 55 56 34
136131
* 78 64 71 57 77
132+
* 179 193 173 187 180
133+
* 194 174 188 181 195
134+
* 176 183 169 189 175
135+
* 160 153 167 168 182
137136
* 316 323 309 329 330
138137
* 310 324 317 331 311
139138
* 308 307 293 300 286

generator/generator.cc

+58-7
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ struct data_header {
4343
uint32_t off_ro;
4444
uint32_t off_roh;
4545
uint32_t off_ri;
46+
uint32_t off_rsrc;
4647
uint32_t off_line;
4748
uint32_t off_p2r;
4849
uint32_t off_p2p;
@@ -56,6 +57,7 @@ struct data_header {
5657

5758
uint32_t count_ro;
5859
uint32_t count_ri;
60+
uint32_t count_rsrc;
5961
uint32_t count_p2r;
6062
uint32_t count_p2p;
6163
uint32_t count_inv;
@@ -183,6 +185,9 @@ int main(int argc, char **argv)
183185

184186
std::vector<uint32_t> rnode_vec;
185187
std::vector<uint32_t> rnode_pos;
188+
std::vector<uint8_t> source_patterns;
189+
std::unordered_map<uint16_t, std::vector<uint32_t>> source_offsets;
190+
uint32_t source_offsets_counts = 0;
186191

187192
uint8_t *opos = output.data() + dh->off_ro;
188193
while(rparse.rn || lparse.rn) {
@@ -210,17 +215,57 @@ int main(int argc, char **argv)
210215
rb.ro_line_info_index = lv ? get_line_info(lparse.li) : 0xffff;
211216
rb.ro_driver_position = lv ? lparse.driver_position : 0;
212217
rb.ro_fw_pos = rv ? rparse.fw_pos : 0;
213-
214218
uint32_t span = rv ? rparse.pattern == 0xfe ? 1 : rmux_patterns[rparse.pattern].span : 0;
215-
216-
memcpy(opos, &rb, sizeof(rb));
219+
220+
uint8_t *rbpos = opos;
217221
opos += sizeof(rb);
218222

219223
if(span) {
220-
memcpy(opos, rparse.sources.data(), span*4);
221-
opos += 4*span;
224+
uint8_t srcidx[64];
225+
uint8_t backidx[64];
226+
uint32_t srclen = 0;
227+
228+
for(uint32_t i = 0; i != span; i++) {
229+
if(rparse.sources[i]) {
230+
if(i != srclen)
231+
rparse.sources[srclen] = rparse.sources[i];
232+
srcidx[srclen] = i;
233+
backidx[i] = srclen++;
234+
} else
235+
backidx[i] = 0xff;
236+
}
237+
238+
rb.ro_span = span;
239+
rb.ro_srclen = srclen;
240+
241+
uint16_t key = (span << 8) | srclen;
242+
auto &offs = source_offsets[key];
243+
for(uint32_t off : offs)
244+
if(!memcmp(source_patterns.data() + off, srcidx, srclen)) {
245+
rb.ro_srcoff = off;
246+
goto found;
247+
}
248+
{
249+
uint32_t off = source_patterns.size();
250+
rb.ro_srcoff = off;
251+
source_patterns.resize(off + srclen + span);
252+
memcpy(source_patterns.data() + off, srcidx, srclen);
253+
memcpy(source_patterns.data() + off + srclen, backidx, span);
254+
offs.push_back(off);
255+
source_offsets_counts ++;
256+
}
257+
258+
found:
259+
memcpy(opos, rparse.sources.data(), srclen*4);
260+
opos += 4*srclen;
261+
} else {
262+
rb.ro_span = 0;
263+
rb.ro_srclen = 0;
264+
rb.ro_srcoff = 0xffff;
222265
}
223266

267+
memcpy(rbpos, &rb, sizeof(rb));
268+
224269
if(rb.ro_targets_count || rb.ro_targets_caps_count) {
225270
memcpy(opos, lparse.targets.data(), rb.ro_targets_count*4);
226271
opos += rb.ro_targets_count*4;
@@ -250,6 +295,7 @@ int main(int argc, char **argv)
250295
auto hdata = bdz_ph_hash::make(rnode_vec);
251296
size_t rohs = (hdata.size() + 3) & ~3;
252297
size_t ris = 4*bdz_ph_hash::output_range(hdata);
298+
size_t rsrc = (source_patterns.size() + 3) & ~3;
253299
size_t llines = sizeof(rnode_line_information)*rli_data.size();
254300
size_t p2rs = p2r.data.size()*sizeof(p2r_info);
255301
size_t p2ps = p2p.data.size()*sizeof(p2p_info);
@@ -263,7 +309,8 @@ int main(int argc, char **argv)
263309

264310
dh->off_roh = opos - output.data();
265311
dh->off_ri = dh->off_roh + rohs;
266-
dh->off_line = dh->off_ri + ris;
312+
dh->off_rsrc = dh->off_ri + ris;
313+
dh->off_line = dh->off_rsrc + rsrc;
267314
dh->off_p2r = dh->off_line + llines;
268315
dh->off_p2p = dh->off_p2r + p2rs;
269316
dh->off_inv = dh->off_p2p + p2ps;
@@ -277,6 +324,7 @@ int main(int argc, char **argv)
277324

278325
dh->count_ro = rnode_vec.size();
279326
dh->count_ri = bdz_ph_hash::output_range(hdata);
327+
dh->count_rsrc = source_patterns.size() ;
280328
dh->count_p2r = p2r.data.size();
281329
dh->count_p2p = p2p.data.size();
282330
dh->count_inv = inv.data.size();
@@ -298,6 +346,7 @@ int main(int argc, char **argv)
298346
ro->ro_ri = idx;
299347
}
300348

349+
memcpy(output.data() + dh->off_rsrc, source_patterns.data(), dh->count_rsrc);
301350
memcpy(output.data() + dh->off_line, rli_data.data(), llines);
302351
memcpy(output.data() + dh->off_p2r, p2r.data.data(), p2rs);
303352
memcpy(output.data() + dh->off_p2p, p2p.data.data(), p2ps);
@@ -310,13 +359,15 @@ int main(int argc, char **argv)
310359
memcpy(output.data() + dh->off_dqs16, dqs16_info.data(), dqs16s);
311360
memcpy(output.data() + dh->off_iob, iob.data.data(), iobs);
312361

313-
fprintf(stderr, "%-6s size %9d ro %9d rh %7d ri %8d rc %7d lines %5d p2r %5d p2p %4d inv %5d one %2d dcram %2d hps %2d fixed %2d dqs16 %2d iob %3d\n",
362+
fprintf(stderr, "%-6s size %9d ro %9d rh %7d ri %8d rc %7d rsrc %d/%d lines %5d p2r %5d p2p %4d inv %5d one %2d dcram %2d hps %2d fixed %2d dqs16 %2d iob %3d\n",
314363
chip.c_str(),
315364
int(output.size()),
316365
dh->off_roh - dh->off_ro,
317366
dh->off_ri - dh->off_roh,
318367
dh->count_ri,
319368
dh->count_ro,
369+
source_offsets_counts,
370+
dh->count_rsrc,
320371
int(rli_data.size()),
321372
int(p2r.data.size()),
322373
int(p2p.data.size()),

generator/nodes.h

+3
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ struct rnode_object {
108108
uint8_t ro_targets_count;
109109
uint8_t ro_targets_caps_count;
110110
uint8_t ro_drivers[2];
111+
uint8_t ro_span;
112+
uint8_t ro_srclen;
113+
uint16_t ro_srcoff;
111114
uint16_t ro_line_info_index;
112115
uint16_t ro_driver_position;
113116
uint32_t ro_fw_pos;

libmistral/cv-bmux.cc

+2
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,8 @@ void mistral::CycloneV::bmux_val_set(uint32_t base, const bmux *mux, int idx, bm
292292
uint32_t pos = (base & 0xffff) + bt[0];
293293
if(base & (1<<23))
294294
bmux_dqs16_adjust(pos, bt[0], base & (1 << 22));
295+
if(pos >= prami.size())
296+
abort();
295297
prami[pos] = b >= 64 ? 0 : (val >> b) & 1;
296298
bt ++;
297299
}

libmistral/cv-rmux.cc

+8-5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ void mistral::CycloneV::rmux_load()
4949
ro_end = reinterpret_cast<const rnode_object *>(data + dhead->off_roh);
5050
roh_info = data + dhead->off_roh;
5151
ri_info = reinterpret_cast<const uint32_t *>(data + dhead->off_ri);
52+
rsrc_info = data + dhead->off_rsrc;
5253
rli_data = reinterpret_cast<const rnode_line_information *>(data + dhead->off_line);
5354
p2r_infos = reinterpret_cast<const p2r_info *>(data + dhead->off_p2r);
5455
p2p_infos = reinterpret_cast<const p2p_info *>(data + dhead->off_p2p);
@@ -114,7 +115,7 @@ mistral::CycloneV::rnode_coords mistral::CycloneV::rmux_get_source(const rnode_o
114115
int slot = rmux_get_slot(r);
115116
if(slot == -1)
116117
return rnode_coords();
117-
return r.sources_begin()[slot];
118+
return r.sources_begin()[r.sources_backward_mapping(rsrc_info)[slot]];
118119
}
119120

120121
bool mistral::CycloneV::rnode_do_link(rnode_coords n1, rnode_coords n2)
@@ -125,9 +126,10 @@ bool mistral::CycloneV::rnode_do_link(rnode_coords n1, rnode_coords n2)
125126
return n1 == r->sources_begin()[0];
126127
const rmux_pattern &pat = rmux_patterns[r->pattern()];
127128
const rnode_coords *sources = r->sources_begin();
128-
for(int slot = 0; slot != pat.span; slot++)
129-
if(sources[slot] == n1) {
130-
rmux_set_val(*r, rmux_vals[pat.o_vals + slot]);
129+
const uint8_t *srcslot = r->sources_forward_mapping(rsrc_info);
130+
for(uint8_t idx = 0; idx != r->sources_count(); idx++)
131+
if(sources[idx] == n1) {
132+
rmux_set_val(*r, rmux_vals[pat.o_vals + srcslot[idx]]);
131133
return true;
132134
}
133135
return false;
@@ -150,11 +152,12 @@ bool mistral::CycloneV::rmux_is_default(rnode_coords node) const
150152

151153
void mistral::CycloneV::route_set_defaults()
152154
{
153-
for(const auto &r : rnodes())
155+
for(const auto &r : rnodes()) {
154156
if(r.pattern() < 0xfe) {
155157
const rmux_pattern &pat = rmux_patterns[r.pattern()];
156158
rmux_set_val(r, pat.def);
157159
}
160+
}
158161
}
159162

160163
bool mistral::CycloneV::rnode_active(const rnode_object *rn, rnode_coords previous) const

libmistral/cyclonev.cc

-2
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,6 @@ void mistral::CycloneV::validate_fw_bw() const
495495
const rnode_coords *rs = ro->sources_begin();
496496
for(uint32_t i=0; i != ro->sources_count(); i++) {
497497
rnode_coords rns = rs[i];
498-
if(!rns)
499-
continue;
500498
const rnode_object *rnso = rc2ro(rns);
501499
if(!rnso) {
502500
printf("%s: %s - backward node missing.\n", rn.to_string().c_str(), rns.to_string().c_str());

libmistral/cyclonev.h

+24-2
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,9 @@ namespace mistral {
442442
uint8_t ro_targets_count;
443443
uint8_t ro_targets_caps_count;
444444
uint8_t ro_drivers[2];
445+
uint8_t ro_span;
446+
uint8_t ro_srclen;
447+
uint16_t ro_srcoff;
445448
uint16_t ro_line_info_index;
446449
uint16_t ro_driver_position;
447450
uint32_t ro_fw_pos;
@@ -451,7 +454,7 @@ namespace mistral {
451454
inline rnode_index ri() const noexcept { return ro_ri; }
452455

453456
inline uint32_t sources_count() const noexcept {
454-
return ro_pattern == 0xff ? 0 : ro_pattern == 0xfe ? 1 : rmux_patterns[ro_pattern].span;
457+
return ro_srclen;
455458
}
456459

457460
inline const rnode_coords *sources_begin() const noexcept {
@@ -506,6 +509,20 @@ namespace mistral {
506509
return ro_pattern;
507510
}
508511

512+
uint8_t sources_span() const noexcept {
513+
return ro_span;
514+
}
515+
516+
const uint8_t *sources_forward_mapping(const uint8_t *rsrc) const noexcept
517+
{
518+
return rsrc + ro_srcoff;
519+
}
520+
521+
const uint8_t *sources_backward_mapping(const uint8_t *rsrc) const noexcept
522+
{
523+
return rsrc + ro_srcoff + ro_srclen;
524+
}
525+
509526
uint16_t line_info_index() const noexcept {
510527
return ro_line_info_index;
511528
}
@@ -745,6 +762,7 @@ namespace mistral {
745762
uint32_t off_ro;
746763
uint32_t off_roh;
747764
uint32_t off_ri;
765+
uint32_t off_rsrc;
748766
uint32_t off_line;
749767
uint32_t off_p2r;
750768
uint32_t off_p2p;
@@ -758,6 +776,7 @@ namespace mistral {
758776

759777
uint32_t count_ro;
760778
uint32_t count_ri;
779+
uint32_t count_rsrc;
761780
uint32_t count_p2r;
762781
uint32_t count_p2p;
763782
uint32_t count_inv;
@@ -943,12 +962,14 @@ namespace mistral {
943962
public:
944963
rnode_proxy(const rnode_object *_rn) : rn(_rn) {}
945964
rnode_coords rc() const { return rn->rc(); }
965+
rnode_index ri() const { return rn->ri(); }
946966
int pattern() const { return rn->pattern(); }
947967
rnode_source_container_proxy sources() const { return rnode_source_container_proxy(rn); }
948968

949-
private:
950969
const rnode_object *rn;
951970

971+
private:
972+
952973
operator const rnode_object&() const { return *rn; }
953974
};
954975

@@ -1239,6 +1260,7 @@ namespace mistral {
12391260
const rnode_object *ro_begin, *ro_end;
12401261
const uint8_t *roh_info;
12411262
const uint32_t *ri_info;
1263+
const uint8_t *rsrc_info;
12421264
const rnode_line_information *rli_data;
12431265

12441266
const p2r_info *p2r_infos;

tools/mux_to_source.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def dump_muxes(name, muxes, bci, counters, filter = lambda t: True):
227227
hps_clocks = load_mux_data("hps_clocks", { 'i': 18 }, True)
228228
cmuxc = load_mux_data("cmuxc", { 'r': 6, 'R': 1, 'Y': 4 })
229229
cmuxv = load_mux_data("cmuxv", { 'g': 4, 'r': 20, 'G': 1, 'R': 1 })
230-
cmuxh = load_mux_data("cmuxh", { 'g': 4, 'r': 12, 'G': 1, 'R': 1, 'X': 4, 'Y': 8 })
230+
cmuxh = load_mux_data("cmuxh", { 'g': 4, 'r': 12, 'G': 1, 'R': 1 })
231231
dll = load_mux_data("dll", { 'g': 1 })
232232
hssi = load_mux_data("hssi", { 'g': 1, 'i': 3 })
233233
cbuf = load_mux_data("cbuf", { 'g': 1, 'i': 2 })

0 commit comments

Comments
 (0)