From 0987d5a2b99ef1e4ffc4d2301061ee0d0cc4e077 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 6 Jan 2025 14:15:05 +0100 Subject: [PATCH] Start work on BUFG support --- himbaechel/uarch/gatemate/bitstream.cc | 22 ++++++++++++++-------- himbaechel/uarch/gatemate/extra_data.h | 1 + himbaechel/uarch/gatemate/gen/arch_gen.py | 2 ++ himbaechel/uarch/gatemate/pack.cc | 12 ++++++++++++ himbaechel/uarch/gatemate/pack.h | 1 + 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/himbaechel/uarch/gatemate/bitstream.cc b/himbaechel/uarch/gatemate/bitstream.cc index cb169745..03131ab6 100644 --- a/himbaechel/uarch/gatemate/bitstream.cc +++ b/himbaechel/uarch/gatemate/bitstream.cc @@ -132,6 +132,8 @@ struct BitstreamBackend cc.tiles[loc].add_word(stringf("CPE%d.%s", x, p.first.c_str(ctx)), p.second.as_bits()); } } break; + case id_BUFG.index: + break; default: log_error("Unhandled cell %s of type %s\n", cell.second.get()->name.c_str(ctx), cell.second->type.c_str(ctx)); @@ -152,14 +154,18 @@ struct BitstreamBackend IdString name = IdString(extra_data.name); CfgLoc loc = getConfigLoc(ctx, pip.tile); std::string word = name.c_str(ctx); - int x = getInTileIndex(ctx, pip.tile); - if (boost::starts_with(word, "IM.")) - boost::replace_all(word, "IM.", stringf("IM%d.", x)); - if (boost::starts_with(word, "OM.")) - boost::replace_all(word, "OM.", stringf("OM%d.", x)); - if (boost::starts_with(word, "IOES.")) - boost::replace_all(word, "IOES.", "IOES1."); - cc.tiles[loc].add_word(word, int_to_bitvector(extra_data.value, extra_data.bits)); + if (extra_data.flags & MUX_CONFIG) { + cc.configs[loc.die].add_word(word, int_to_bitvector(extra_data.value, extra_data.bits)); + } else { + int x = getInTileIndex(ctx, pip.tile); + if (boost::starts_with(word, "IM.")) + boost::replace_all(word, "IM.", stringf("IM%d.", x)); + if (boost::starts_with(word, "OM.")) + boost::replace_all(word, "OM.", stringf("OM%d.", x)); + if (boost::starts_with(word, "IOES.")) + boost::replace_all(word, "IOES.", "IOES1."); + cc.tiles[loc].add_word(word, int_to_bitvector(extra_data.value, extra_data.bits)); + } } } } diff --git a/himbaechel/uarch/gatemate/extra_data.h b/himbaechel/uarch/gatemate/extra_data.h index 4ebaea43..3b48313d 100644 --- a/himbaechel/uarch/gatemate/extra_data.h +++ b/himbaechel/uarch/gatemate/extra_data.h @@ -36,6 +36,7 @@ enum MuxFlags { MUX_INVERT = 1, MUX_VISIBLE = 2, + MUX_CONFIG = 4, }; enum PipExtra diff --git a/himbaechel/uarch/gatemate/gen/arch_gen.py b/himbaechel/uarch/gatemate/gen/arch_gen.py index 7d4e224a..0404def8 100644 --- a/himbaechel/uarch/gatemate/gen/arch_gen.py +++ b/himbaechel/uarch/gatemate/gen/arch_gen.py @@ -29,6 +29,7 @@ PIP_EXTRA_CPE = 2 MUX_INVERT = 1 MUX_VISIBLE = 2 +MUX_CONFIG = 4 parser = argparse.ArgumentParser() parser.add_argument("--lib", help="Project Peppercorn python database script path", type=str, required=True) @@ -85,6 +86,7 @@ def main(): pp = tt.create_pip(mux.src, mux.dst) mux_flags = MUX_INVERT if mux.invert else 0 mux_flags |= MUX_VISIBLE if mux.visible else 0 + mux_flags |= MUX_CONFIG if mux.config else 0 pp.extra_data = PipExtraData(PIP_EXTRA_MUX, ch.strs.id(mux.name), mux.bits, mux.value, mux_flags) if "CPE" in type_name: pp = tt.create_pip("CPE.IN1", "CPE.RAM_O2") diff --git a/himbaechel/uarch/gatemate/pack.cc b/himbaechel/uarch/gatemate/pack.cc index b8987184..4184a6d7 100644 --- a/himbaechel/uarch/gatemate/pack.cc +++ b/himbaechel/uarch/gatemate/pack.cc @@ -348,6 +348,17 @@ void GateMatePacker::pack_cpe() } } +void GateMatePacker::pack_bufg() +{ + log_info("Packing BUFGs..\n"); + for (auto &cell : ctx->cells) { + CellInfo &ci = *cell.second; + if (!ci.type.in(id_CC_BUFG)) + continue; + ci.type = id_BUFG; + } +} + void GateMatePacker::pack_constants() { log_info("Packing constants..\n"); @@ -397,6 +408,7 @@ void GateMateImpl::pack() GateMatePacker packer(ctx, this); packer.pack_constants(); packer.pack_io(); + packer.pack_bufg(); packer.pack_cpe(); packer.remove_constants(); } diff --git a/himbaechel/uarch/gatemate/pack.h b/himbaechel/uarch/gatemate/pack.h index 15a4fb48..d981d8ae 100644 --- a/himbaechel/uarch/gatemate/pack.h +++ b/himbaechel/uarch/gatemate/pack.h @@ -30,6 +30,7 @@ struct GateMatePacker void pack_io(); void pack_cpe(); + void pack_bufg(); void pack_constants(); void disconnect_if_gnd(CellInfo *cell, IdString input);