FlcData.fromNetlistJson constructor

FlcData.fromNetlistJson(
  1. Map<String, dynamic> json
)

Parse embedded rohd.src_trace attributes from a Yosys netlist.

Embedded traces use the same file-indexed frame representation as FLC data, but store signal and instance maps directly on each module: modules.<module>.attributes.rohd.src_trace.

Implementation

factory FlcData.fromNetlistJson(Map<String, dynamic> json) {
  final rawFiles = json['files'];
  if (rawFiles is! List || rawFiles.any((file) => file is! String)) {
    return FlcData.empty();
  }
  // Frame indexes address this table directly, so do not filter malformed
  // entries and accidentally shift the remaining paths.
  final files = rawFiles.cast<String>();
  final rawModules = json['modules'];
  if (rawModules is! Map) {
    return FlcData.empty();
  }

  final signals = <String, Map<String, FlcEntry>>{};
  final instances = <String, Map<String, FlcEntry>>{};
  for (final moduleEntry in rawModules.entries) {
    final module = moduleEntry.value;
    if (module is! Map) {
      continue;
    }
    final attributes = module['attributes'];
    if (attributes is! Map) {
      continue;
    }
    final trace = attributes['rohd.src_trace'];
    if (trace is! Map) {
      continue;
    }
    final parsed = _parseEmbeddedModule(
      trace.cast<Object?, Object?>(),
      files,
    );
    if (parsed.signals.isNotEmpty) {
      signals[moduleEntry.key.toString()] = parsed.signals;
    }
    if (parsed.instances.isNotEmpty) {
      instances[moduleEntry.key.toString()] = parsed.instances;
    }
  }
  return FlcData._(files: files, signals: signals, instances: instances);
}