aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gowin/arch.cc15
-rw-r--r--gowin/arch.h3
-rw-r--r--gowin/constids.inc2
-rw-r--r--gowin/pack.cc7
4 files changed, 27 insertions, 0 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc
index fa0a66a3..dc40b179 100644
--- a/gowin/arch.cc
+++ b/gowin/arch.cc
@@ -1158,6 +1158,21 @@ Arch::Arch(ArchArgs args) : args(args)
snprintf(buf, 32, "R%dC%d_%s", row + 1, col + 1, portname.c_str(this));
addBelInput(belname, id_CLK, id(buf));
+ const PairPOD *xxx_port = pairLookup(bel->ports.get(), bel->num_ports, ID_XXX_VSS);
+ if (xxx_port != nullptr) {
+ ddr_has_extra_inputs = true;
+ portname = IdString(xxx_port->src_id);
+ snprintf(buf, 32, "R%dC%d_%s", row + 1, col + 1, portname.c_str(this));
+ addBelInput(belname, id_XXX_VSS, id(buf));
+ }
+ xxx_port = pairLookup(bel->ports.get(), bel->num_ports, ID_XXX_VCC);
+ if (xxx_port != nullptr) {
+ ddr_has_extra_inputs = true;
+ portname = IdString(xxx_port->src_id);
+ snprintf(buf, 32, "R%dC%d_%s", row + 1, col + 1, portname.c_str(this));
+ addBelInput(belname, id_XXX_VCC, id(buf));
+ }
+
if (oddrc) {
portname = IdString(pairLookup(bel->ports.get(), bel->num_ports, ID_CE)->src_id);
snprintf(buf, 32, "R%dC%d_%s", row + 1, col + 1, portname.c_str(this));
diff --git a/gowin/arch.h b/gowin/arch.h
index c8392e7e..bc29a59b 100644
--- a/gowin/arch.h
+++ b/gowin/arch.h
@@ -470,6 +470,9 @@ struct Arch : BaseArch<ArchRanges>
void updateClockSpinesCache(IdString spine_id, IdString wire_id);
void fixClockSpineDecals(void);
+ // XXX GW1N-9C DDR quirk
+ bool ddr_has_extra_inputs = false;
+
// Permissible combinations of modes in a single slice
std::map<const IdString, IdString> dff_comp_mode;
};
diff --git a/gowin/constids.inc b/gowin/constids.inc
index b293293b..8159cc10 100644
--- a/gowin/constids.inc
+++ b/gowin/constids.inc
@@ -681,6 +681,8 @@ X(IOBJS)
// IOLOGIC
X(TX)
+X(XXX_VSS)
+X(XXX_VCC)
X(OBUF_TYPE)
X(SBUF)
X(DBUF)
diff --git a/gowin/pack.cc b/gowin/pack.cc
index d31b4a84..28370a75 100644
--- a/gowin/pack.cc
+++ b/gowin/pack.cc
@@ -798,6 +798,13 @@ static void pack_iologic(Context *ctx)
ci->attrs[id_IOBUF] = 1;
}
}
+ // if have XXX_ inputs connect them
+ if (ctx->ddr_has_extra_inputs) {
+ ci->addInput(id_XXX_VSS);
+ ci->connectPort(id_XXX_VSS, ctx->nets[ctx->id("$PACKER_GND_NET")].get());
+ ci->addInput(id_XXX_VCC);
+ ci->connectPort(id_XXX_VCC, ctx->nets[ctx->id("$PACKER_VCC_NET")].get());
+ }
} break;
default:
break;