private void m_btnAnnotateSignals_Click(object sender, EventArgs e) { ClearSignalAnnotations clearCmd = new ClearSignalAnnotations(); clearCmd.InstantiationFilter = m_libElInstSelector.InstanceFilter; Commands.CommandExecuter.Instance.Execute(clearCmd); List <string> portMapping = new List <string>(); foreach (DataGridViewRow row in m_grdViewMapping.Rows) { string port = row.Cells[0].FormattedValue.ToString(); string signal = row.Cells[1].FormattedValue.ToString(); string mapping = row.Cells[2].FormattedValue.ToString(); if (port.Length > 0 && signal.Length > 0 && mapping.Length > 0) { portMapping.Add(port + ":" + signal + ":" + mapping); } } AnnotateSignalNames annoteCmd = new AnnotateSignalNames(); annoteCmd.InstantiationFilter = m_libElInstSelector.InstanceFilter; annoteCmd.PortMapping = portMapping; Commands.CommandExecuter.Instance.Execute(annoteCmd); }
protected override void DoCommandAction() { CheckParameters(); AnnotateSignalNames annotateSignalNames = new AnnotateSignalNames(); annotateSignalNames.InstantiationFilter = InstantiationFilter; annotateSignalNames.LibraryElementFilter = REGEX_MATCH_ALL; annotateSignalNames.StartIndex = START_INDEX; annotateSignalNames.StepWidth = STEP_WIDTH; annotateSignalNames.PortMapping = GetPortMapping(LookupTableInputPort.ToString()); CommandExecuter.Instance.Execute(annotateSignalNames); }
/// <summary> /// /// </summary> /// <param name="dir"></param> /// <param name="connectionPrimitiveName"></param> /// <param name="instance"></param> /// <param name="columns"></param> /// <param name="maxWiresPerRow"></param> /// <param name="prefix">The prefix that can be sued for subsequent AnnotateSignal commands</param> /// <returns></returns> private List <Command> GetPlacementCommands(FPGA.FPGATypes.InterfaceDirection dir, string connectionPrimitiveName, string instance, int columns, int maxWiresPerRow) { LibraryElement libElement = Objects.Library.Instance.GetElement(connectionPrimitiveName); List <Tile> tilesToReleaseWiresOn = null; List <Tile> anchors = GetAnchors(dir, columns, false, out tilesToReleaseWiresOn); Dictionary <int, List <Signal> > inputsPerColumn = new Dictionary <int, List <Signal> >(); Dictionary <int, List <Signal> > outputsPerColumn = new Dictionary <int, List <Signal> >(); //Console.WriteLine(dir); //Console.WriteLine(instance); for (int column = 0; column < columns; column++) { List <Signal> inputs = GetSignals(dir, column, "in"); List <Signal> outputs = GetSignals(dir, column, "out"); // equalize both list with open signals, the signal paramteres are dont care while (inputs.Count % maxWiresPerRow != 0 || inputs.Count < outputs.Count) { inputs.Add(new Signal("open", "in", dir, IslandName, column)); } while (outputs.Count < inputs.Count) { outputs.Add(new Signal("open", "out", dir, IslandName, column)); } inputsPerColumn[column] = inputs; outputsPerColumn[column] = outputs; } Dictionary <Tile, List <Signal> > inputsOnTile = new Dictionary <Tile, List <Signal> >(); Dictionary <Tile, List <Signal> > outputsOnTile = new Dictionary <Tile, List <Signal> >(); List <Tile> connectionPrimitiveCLBs = new List <Tile>(); // 1 collect inputs in this tile // iterate row wise for (int column = 0; column < columns; column++) { Tile currentAnchor = anchors[column]; for (int i = 0; i < inputsPerColumn[column].Count; i += maxWiresPerRow) { inputsOnTile.Add(currentAnchor, new List <Signal>()); outputsOnTile.Add(currentAnchor, new List <Signal>()); connectionPrimitiveCLBs.Add(currentAnchor); for (int j = 0; j < maxWiresPerRow; j++) { Signal input = inputsPerColumn[column][i + j]; inputsOnTile[currentAnchor].Add(input); Signal output = outputsPerColumn[column][i + j]; outputsOnTile[currentAnchor].Add(output); } currentAnchor = MoveAnchorToNextColumn(dir, currentAnchor); } } CheckMacroTiles(dir, connectionPrimitiveCLBs); string prefix = instance + connectionPrimitiveName; // do connection primitive instantiation List <Command> result = new List <Command>(); foreach (Tile anchor in connectionPrimitiveCLBs) { List <Signal> localInputs = inputsOnTile[anchor]; List <Signal> localOutputs = outputsOnTile[anchor]; // do we need to place a macro here bool placeMacro = HasNonOpenSignal(localInputs) || HasNonOpenSignal(localOutputs); if (!placeMacro) { continue; } // check that the added signal names are all identical if (localOutputs.Select(s => s.SignalNameWithoutBraces).Distinct().Count() != 1) { throw new ArgumentException("Signal names may only change at a boundary of 4. Check signal " + localInputs[0]); } if (localInputs.Select(s => s.SignalNameWithoutBraces).Distinct().Count() != 1) { throw new ArgumentException("Signal names may only change at a boundary of 4. Check signal " + localOutputs[0]); } // can we use this tile for placement? StringBuilder errorList = null; bool validPlacement = DesignRuleChecker.CheckLibraryElementPlacement(anchor, libElement, out errorList); if (!validPlacement) { throw new ArgumentException("Can not place the library element at the desired postion (check the output window)" + errorList.ToString()); } // finally, place the macro AddSingleInstantiationByTile addByTile = new AddSingleInstantiationByTile(); addByTile.AnchorLocation = anchor.Location; addByTile.AutoClearModuleSlot = false; addByTile.InstanceName = prefix + "_" + result.Count; addByTile.LibraryElementName = connectionPrimitiveName; if (result.Count == 0) { addByTile.Comment = "instantiate a connection primitive at tile " + addByTile.AnchorLocation + ". An expert may want to relocate the instantiations"; } result.Add(addByTile); AnnotateSignalNames annotateCmd = new AnnotateSignalNames(); annotateCmd.InstantiationFilter = "^" + addByTile.InstanceName; string inputSource = BuildTarget == Target.Static ? "I:" : "O:"; string outputSource = BuildTarget == Target.Static ? "O:" : "I:"; annotateCmd.PortMapping.Add(inputSource + localInputs[0].SignalNameWithoutBraces + ":external"); annotateCmd.PortMapping.Add(outputSource + localOutputs[0].SignalNameWithoutBraces + ":external"); annotateCmd.PortMapping.Add("H:H:internal"); result.Add(annotateCmd); } return(result); }