public void buildReport() {

    vdomainReport = ReportCellFactory.eINSTANCE.createCellReportModule();

    for (VoltageSource vs : vdomain.getVoltageSrcs()) {

      // get the cell split for the voltage source
      //
      PortDBNode vsPin = vs.getPin();
      if (moduleWithPM instanceof InstanceDBNode) {
        // the PM is defined in a hierarchical instance
        // make the pin relative to the current model
        vsPin = (PortDBNode) ((InstanceDBNode) moduleWithPM).append(vsPin.elements());
      }

      CellReportPinBuilder vsrcReportBuilder = new CellReportPinBuilder(vsPin);
      vsrcReportBuilder.buildReport();

      CellReportFamilyGLModuleContent summaryVS = vsrcReportBuilder.getReport().getModuleSummary();

      CellReportModuleBuilder builder = new CellReportModuleBuilder(vdomainReport);
      builder.addPortFromTotalSubReport(vs.getName(), summaryVS);
    }
  }
  public boolean fillScenario(String vcdFile) {

    scenario.clearActivities();

    // Read the mapping file if any --------------
    //
    try {
      if (remapFileName != null && remapFileName.trim().length() > 0) readPinMapping();
    } catch (FileNotFoundException e) {
      Logger.error("VCD", "cannot find file " + remapFileName);
    } catch (IOException e) {
      Logger.error("VCD", "file " + remapFileName + "incorrect");
    } catch (Exception e) {
      Logger.error("VCD", "FATAL ERROR when reading the rempping file" + remapFileName);
    }

    // Convert the VCD ----------------------------
    //
    try {
      reader = new VCDReader(vcdFile);
    } catch (Exception e) {
      Logger.error("VCD", "cannot open file " + vcdFile);
      return false;
    }

    Signal sig;
    String origPinName;
    String pinName;
    PortDBNode portNode;
    finalTime = -1;
    Object value;
    BoxSliceActivitySlice period = null;

    while ((sig = reader.getForceCommand()) != null) {

      if (finalTime != sig.time) {
        if (period != null) period.setActivityRatio(sig.time);

        period =
            scenario.addActivityPeriod(
                Float.toString(sig.time).replaceAll("\\.", "_"), sig.time, false, false);

        finalTime = sig.time;
      }

      if (sig == VCDReader.NO_SIGNAL) {
        if (sig.time > 0) break;
        else continue;
      }

      origPinName = sig.name.trim();

      if (pinRemapping != null && pinRemapping.containsKey(origPinName))
        pinName = pinRemapping.get(origPinName);
      else if (ignoredVCDPin != null && ignoredVCDPin.contains(origPinName)) continue; // ignore
      else pinName = origPinName;

      //			//DEBUG
      //			if (!pinName.contains("lclk_falcon_1"))
      //				continue;

      if (pinNodeCache.containsKey(pinName)) {
        portNode = pinNodeCache.get(pinName);

        // the pin was already encountered and does not exist, skip the VCD line
        if (portNode == null) continue;

      } else {
        portNode = DBNodeTools.getPortDBNode(scenario.getModel(), pinName);

        pinNodeCache.put(pinName, portNode);

        if (portNode == null) {
          Logger.error("VCD", "the pin " + origPinName + " or its remapping does not exist");
          continue;
        }
      }
      ComputerTypes computerType = portNode.getPort().getComputerType();
      value = computerType.getDefaultValue();

      switch (sig.type) {
        case REAL:
          if (!computerType.getJavaType().equalsIgnoreCase("float"))
            value = ToolsDesignTypes.formatValueToType(computerType, (float) sig.value_real);
          else value = (float) sig.value_real;
          break;

        default:
          switch (computerType) {
            case STRING:
              value = new String(new java.math.BigInteger(sig.value_bus, 2).toByteArray());
              break;

            default:
              value = ToolsDesignTypes.formatValueToType(computerType, sig.value_bus);
              break;
          }
          break;
      }

      period.getSlice().addActivity(new PinState(null, portNode, value, false), 1, true, 0);
    }

    // normalize the time of all period
    float current = 0;
    float t;
    for (BoxSliceActivity act : scenario.getActivities()) {
      t = act.getActivityRatio() / finalTime;
      act.setActivityRatio(t - current);
      current = t;
    }

    return true;
  }