instantiationVerilogFor static method

String instantiationVerilogFor({
  1. required Module module,
  2. required String instanceType,
  3. required String instanceName,
  4. required Map<String, String> ports,
  5. Map<String, String>? parameters,
  6. bool forceStandardInstantiation = false,
})

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);';
}