instantiationVerilogFor static method
Creates a line of SystemVerilog that instantiates module
.
The instantiation will create it as type instanceType
and name
instanceName
.
ports
maps module
input/output/inout names to a verilog signal name.
For example:
To generate this SystemVerilog: sig_c = sig_a & sig_b
Based on this module definition: c <= a & b
The values for ports
should be:
ports: { 'a' : 'sig_a', 'b' : 'sig_b', 'c' : 'sig_c'}
If forceStandardInstantiation
is set, then the standard instantiation
for SystemVerilog modules will be used.
If parameters
is provided, then the module will be instantiated with
all of the keys as parameter names set to the corresponding values
provided.
Implementation
static String instantiationVerilogFor(
{required Module module,
required String instanceType,
required String instanceName,
required Map<String, String> ports,
Map<String, String>? parameters,
bool forceStandardInstantiation = false}) {
if (!forceStandardInstantiation) {
if (module is SystemVerilog) {
return module.instantiationVerilog(
instanceType,
instanceName,
ports,
) ??
instantiationVerilogFor(
module: module,
instanceType: instanceType,
instanceName: instanceName,
ports: ports,
forceStandardInstantiation: true);
}
// ignore: deprecated_member_use_from_same_package
else if (module is CustomSystemVerilog) {
return module.instantiationVerilog(
instanceType,
instanceName,
Map.fromEntries(ports.entries
.where((element) => module.inputs.containsKey(element.key))),
Map.fromEntries(ports.entries
.where((element) => module.outputs.containsKey(element.key))),
);
}
}
//non-custom needs more details
final connections = <String>[];
for (final signalName in module.inputs.keys) {
connections.add('.$signalName(${ports[signalName]!})');
}
for (final signalName in module.outputs.keys) {
connections.add('.$signalName(${ports[signalName]!})');
}
for (final signalName in module.inOuts.keys) {
connections.add('.$signalName(${ports[signalName]!})');
}
final connectionsStr = connections.join(',');
var parameterString = '';
if (parameters != null && parameters.isNotEmpty) {
final parameterContents =
parameters.entries.map((e) => '.${e.key}(${e.value})').join(',');
parameterString = '#($parameterContents)';
}
return '$instanceType $parameterString $instanceName($connectionsStr);';
}