Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
531374b
qlf_k6n10f: New ql_dsp pass, move to DSPV2
povik Feb 4, 2025
e1074e0
qlf_k6n10f: Fix DSPV2 models
povik Feb 20, 2025
370a033
qlf_k6n10f: Start tests
povik Feb 20, 2025
c451d8e
synth_quicklogic: add -dspv2 to opt into v2 DSP blocks
widlarizer Feb 25, 2025
47b270a
synth_quicklogic: enable dspv2 tests, fix -dspv2
widlarizer Feb 25, 2025
651d572
ql_dsp_macc: dspv2
widlarizer Feb 27, 2025
ed239b6
ql_dsp_macc: whitespace. NFC
widlarizer Feb 27, 2025
9b52ba8
quicklogic: ql_dsp_simd add dspv2 support, fix dspv1
widlarizer Mar 5, 2025
f55da95
quicklogic: update dspv2_sim.v to v1.1 Feb21
widlarizer Mar 5, 2025
62885f1
quicklogic: ql_dsp_simd remove unused MODE_BITS packing
widlarizer Mar 6, 2025
fcdd013
quicklogic: allow fractured mode on canonical dspv1 modules
widlarizer Mar 6, 2025
642c313
quicklogic: remove irrelevant comments in dspv2 test
widlarizer Mar 6, 2025
7380cf6
quicklogic: ql_dsp_simd add dspv1 test
widlarizer Mar 6, 2025
a13b0f6
quicklogic: rename dspv1 full synth_quicklogic test for clarity
widlarizer Mar 6, 2025
15b3ed4
quicklogic: ql_dsp_macc set fractured mode
widlarizer Mar 6, 2025
35efe92
quicklogic: fix dspv2 tests
widlarizer Mar 6, 2025
fb3ad31
quicklogic: ql_dsp_io_regs debug print
widlarizer Mar 6, 2025
4cbc92f
quicklogic: add fracturable full-block dspv1 to keep vendor simulatio…
widlarizer Mar 10, 2025
0b8243b
quicklogic: Revert changes to converge development
povik Mar 10, 2025
6a3d1cc
ql_dsp_macc: Avoid ID() macro for common IDs
povik Mar 5, 2025
c439f8c
quicklogic: Fix cascading
povik Mar 10, 2025
947ca84
ql_dsp: Add promotion on cascading
povik Mar 10, 2025
0615209
ql_dsp_macc: Support v2 DSP
povik Mar 10, 2025
fde6816
ql_dsp: Improve cascading detection
povik Mar 11, 2025
f157a86
ql_dsp: Add outer loop
povik Mar 11, 2025
b230c00
ql_dsp: Fix precondition for cascading
povik Mar 11, 2025
7f833f4
ql_dsp: Add help
povik Mar 11, 2025
26dc680
ql_dsp: Relax packing condition
povik Mar 11, 2025
0180e8f
ql_dsp: Fix parameter widths, forbid self-cascading
povik Mar 11, 2025
0d48481
ql_dsp_io_regs: Add DSPv2 support, adjust sim model
povik Mar 11, 2025
4f2a06f
quicklogic: Complete DSPv2 flow
povik Mar 11, 2025
1e9e7ad
quicklogic: Redo DSPv2 tests
povik Mar 11, 2025
b6a9d78
ql_dsp: Add `-nocascade`
povik Mar 11, 2025
397f748
tests: Update path to sim model
povik Mar 11, 2025
79b8ed1
quicklogic: Fix missing install rule
povik Mar 11, 2025
535dab1
quicklogic: Fix one more rule
povik Mar 11, 2025
de61ff8
quicklogic: Tune include path to fix OOT builds
povik Mar 11, 2025
c68fd85
ql_dsp_simd: Remove array usage failing VS build
povik Mar 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions techlibs/quicklogic/Makefile.inc
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@ OBJS += techlibs/quicklogic/ql_ioff.o
# --------------------------------------

OBJS += techlibs/quicklogic/ql_dsp_macc.o
GENFILES += techlibs/quicklogic/ql_dsp_macc_pm.h techlibs/quicklogic/qlf_k6n10f/bram_types_sim.v
OBJS += techlibs/quicklogic/ql_dsp.o
GENFILES += techlibs/quicklogic/ql_dsp_macc_pm.h techlibs/quicklogic/ql_dsp_pm.h techlibs/quicklogic/qlf_k6n10f/bram_types_sim.v
techlibs/quicklogic/ql_dsp_macc.o: techlibs/quicklogic/ql_dsp_macc_pm.h
techlibs/quicklogic/ql_dsp.o: techlibs/quicklogic/ql_dsp_pm.h
$(eval $(call add_extra_objs,techlibs/quicklogic/ql_dsp_macc_pm.h))
$(eval $(call add_extra_objs,techlibs/quicklogic/ql_dsp_pm.h))

# --------------------------------------

Expand All @@ -36,9 +39,13 @@ $(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf
$(eval $(call add_gen_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/bram_types_sim.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/cells_sim.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/ffs_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dsp_sim.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dsp_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dsp_final_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv1_sim.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv1_sim_extra.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv1_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv1_final_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv2_sim.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv2_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/dspv2_final_map.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/TDP18K_FIFO.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/ufifo_ctl.v))
$(eval $(call add_share_file,share/quicklogic/qlf_k6n10f,techlibs/quicklogic/qlf_k6n10f/sram1024x18_mem.v))
134 changes: 134 additions & 0 deletions techlibs/quicklogic/ql_dsp.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* yosys -- Yosys Open SYnthesis Suite
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/

#include "kernel/rtlil.h"
#include "kernel/register.h"
#include "kernel/sigtools.h"

PRIVATE_NAMESPACE_BEGIN
USING_YOSYS_NAMESPACE

// promote dspv2_16x9x32_cfg_ports to dspv2_32x18x64_cfg_ports if need be
bool promote(Module *m, Cell *cell) {
if (cell->type == ID(dspv2_32x18x64_cfg_ports)) {
return false;
} else {
log_assert(cell->type == ID(dspv2_16x9x32_cfg_ports));
}

auto widen_output = [&](IdString port_name, int new_width) {
if (!cell->hasPort(port_name))
return;
SigSpec port = cell->getPort(port_name);
if (port.size() < new_width) {
port = {m->addWire(NEW_ID, new_width - port.size()), port};
cell->setPort(port_name, port);
}
};

auto widen_input = [&](IdString port_name, int new_width) {
if (!cell->hasPort(port_name))
return;
SigSpec port = cell->getPort(port_name);
if (port.size() < new_width) {
port.extend_u0(new_width, /* is_signed= */ true);
cell->setPort(port_name, port);
}
};

widen_output(ID(z_o), 50);
widen_output(ID(a_cout_o), 32);
widen_output(ID(b_cout_o), 18);
widen_output(ID(z_cout_o), 50);

auto uses_port = [&](IdString port_name) {
return cell->hasPort(port_name) && !cell->getPort(port_name).is_fully_undef();
};

if (uses_port(ID(a_cin_i)) || uses_port(ID(b_cin_i)) || uses_port(ID(z_cin_i))) {
log_error("Cannot promote %s (type %s) with cascading paths\n", log_id(cell), log_id(cell->type));
}

widen_input(ID(a_i), 32);
widen_input(ID(b_i), 18);
widen_input(ID(c_i), 18);
cell->type = ID(dspv2_32x18x64_cfg_ports);
return true;
}

bool did_something;

#include "techlibs/quicklogic/ql_dsp_pm.h"

struct QlDspPass : Pass {
QlDspPass() : Pass("ql_dsp", "pack into QuickLogic DSPs") {}

void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" ql_dsp [selection]\n");
log("\n");
log("This pass packs input and output path registers into QuickLogic DSP blocks,\n");
log("additionally it supports Z path cascading and post-adder packing.\n");
log("\n");
log(" -nocascade\n");
log(" forbid cascading\n");
log("\n");

}

void execute(std::vector<std::string> args, RTLIL::Design *d) override
{
log_header(d, "Executing QL_DSP pass. (pack into QuickLogic DSPs)\n");

bool nocascade = false;
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++) {
if (args[argidx] == "-nocascade") {
nocascade = true;
continue;
}
break;
}
extra_args(args, argidx, d);

for (auto module : d->selected_modules()) {
did_something = true;

while (did_something)
{
// TODO: could be optimized by more reuse of the pmgen object
did_something = false;
{
ql_dsp_pm pm(module, module->selected_cells());
pm.run_ql_dsp_pack_regs();
}
if (!nocascade) {
ql_dsp_pm pm(module, module->selected_cells());
pm.run_ql_dsp_cascade();
}
{
ql_dsp_pm pm(module, module->selected_cells());
pm.run_ql_dsp_pack_regs();
}
}
}
}
} QlDspPass;

PRIVATE_NAMESPACE_END
Loading
Loading