예제 #1
0
        public bool TryGetTemplate(string moduleName, ModuleLayout modLayout, out PlacementInfo placement)
        {
            PlaceTemplate modTemplate;

            lock (Templates)
            {
                if (!Templates.TryGetValue(moduleName, out modTemplate))
                {
                    placement = null;
                    return(false);
                }
            }

            lock (Converters)
            {
                if (Converters.TryGetValue(moduleName, out var cons))
                {
                    placement = cons.First(x => x.Ctrl == modLayout).Convert(modTemplate);
                    return(true);
                }
            }

            placement = null;
            return(false);
        }
        private void displayModuleList(List<IModule> moduleList)
        {
            if (nestedPaneList == null)
                nestedPaneList = new List<StackPanel>();
            int size = moduleList.Count;
            int rows = (int)Math.Ceiling((decimal)size / ROW_SIZE);

            for (int n = 0; n < rows; n++)
            {
                StackPanel newPanel = new StackPanel();
                newPanel.Orientation = Orientation.Horizontal;
                nestedPaneList.Add(newPanel);
            }
            if (moduleList != null && moduleList.Count > 0)
            {
                for (int i = 0; i < moduleList.Count; i++)
                {
                    IModule module = moduleList[i] as IModule;

                    // Calcul de la position du ModuleLayout
                    int position = (int)Math.Ceiling((decimal)(i + 1) / ROW_SIZE) - 1;

                    // On crée l'objet graphique lié au module, et on lui donne sa classe
                    ModuleLayout view = new ModuleLayout(module);
                    nestedPaneList[position].Children.Add(view);
                }
            }
            foreach (StackPanel subPanel in nestedPaneList)
            {
                modulesPanel.Children.Add(subPanel);
            }
        }
예제 #3
0
        public bool TryGetTemplate(string moduleName, ModuleLayout modLayout, out List <WirePath> wires)
        {
            RouteTemplate modTemplate;

            lock (Templates)
            {
                if (!Templates.TryGetValue(moduleName, out modTemplate))
                {
                    wires = null;
                    return(false);
                }
            }

            lock (Converters)
            {
                if (Converters.TryGetValue(moduleName, out var cons))
                {
                    wires = cons.First(x => x.Ctrl == modLayout).Convert(modTemplate);
                    return(true);
                }
            }

            wires = null;
            return(false);
        }
예제 #4
0
        public void SubscribeToTemplate(string moduleName, ModuleLayout ctrl, FIRRTLNode[] nodeOrder)
        {
            PlaceTemplateConversion conversion = new PlaceTemplateConversion(ctrl, nodeOrder);

            lock (Converters)
            {
                if (Converters.TryGetValue(moduleName, out var convs))
                {
                    convs.Add(conversion);
                }
                else
                {
                    Converters.Add(moduleName, new List <PlaceTemplateConversion>()
                    {
                        conversion
                    });
                }
            }

            lock (Templates)
            {
                if (Templates.TryGetValue(moduleName, out var template))
                {
                    conversion.TemplateUpdated(template);
                }
            }
        }
예제 #5
0
        public static ModuleLayout ReadBin(string path)
        {
            ModuleLayout module = new ModuleLayout();

            using (BinaryReader b_reader = new BinaryReader(File.Open(path, FileMode.Open))) {
                module.Read(b_reader);
            }

            return(module);
        }
예제 #6
0
        public static void Main(string[] args)
        {
            Console.WriteLine("Reading module file...");
            modLayout = ReadBin("content\\out.ptptb");
            Console.WriteLine($"Done. Read {modLayout.header.signature}.");
            Module mod = new Module(modLayout);

            Runner.Prepare(mod);
            Runner.Run();
            Console.ReadLine();

            //ArchitectureBuilder builder = new ArchitectureBuilder();
            //var a = builder.Build(File.ReadAllText("content/yafn.arch"))[0];
        }
예제 #7
0
파일: Router.cs 프로젝트: TheAIBot/Bioly
        private static Droplet[] GetModulesDropletRoutingOrder(Module module, Board board)
        {
            ModuleLayout      inputLayout   = module.GetInputLayout();
            HashSet <Droplet> dropletInputs = new HashSet <Droplet>(inputLayout.Droplets);

            Rectangle[] layoutRectangles = inputLayout.GetAllRectanglesIncludingDroplets();
            //Also contains rectangles for droplets but in this case they are considered
            //empty rectangles because they aren't filled with droplet yet
            HashSet <Rectangle> layoutEmptyRectangles = layoutRectangles.ToHashSet();
            HashSet <Rectangle> outsideEmptyRectangle = module.Shape.AdjacentRectangles
                                                        .Where(rectangle => rectangle.isEmpty)
                                                        .ToHashSet();

            Rectangle.ReplaceRectangles(module.Shape, layoutRectangles);

            Droplet[] dropletRoutingOrder = new Droplet[dropletInputs.Count];
            int       dropletIndex        = 0;

            //A droplet needs to be routed to all interal droplets of the module.
            while (dropletInputs.Count > 0)
            {
                bool hasDropletBeenRouted = false;
                foreach (var dropletInput in dropletInputs)
                {
                    if (Board.DoesNotBlockConnectionToSourceEmptyRectangles(dropletInput, outsideEmptyRectangle, layoutEmptyRectangles))
                    {
                        hasDropletBeenRouted = true;
                        dropletRoutingOrder[dropletIndex++] = dropletInput;
                        dropletInputs.Remove(dropletInput);
                        //A droplet has now been placed in that module so
                        //it's rectangle is no longer empty
                        layoutEmptyRectangles.Remove(dropletInput.Shape);
                        break;
                    }
                }
                if (!hasDropletBeenRouted)
                {
                    throw new InternalRuntimeException("It is not possible to route a droplet to every internal droplet inside a module. This should always be possible." +
                                                       "The module is: " + module.ToString());
                }
            }

            Rectangle.ReplaceRectangles(layoutRectangles, module.Shape);

            return(dropletRoutingOrder);
        }
예제 #8
0
        public Module(ModuleLayout layout)
        {
            _layout = layout;


            int[] labelsCount = new int[_layout.data.sectionsCount];
            Array.Clear(labelsCount, 0, _layout.data.sectionsCount);

            Label[] labels = new Label[_layout.data.symbolsCount];
            for (int i = 0; i < _layout.data.symbolsCount; i++)
            {
                SymbolLayout symbol = _layout.data.symbols[i];
                labelsCount[symbol.sectionIndex]++;
                labels[i] = new Label()
                {
                    Name      = _layout.data.strings[symbol.nameIndex],
                    Offset    = symbol.blobEntryIndex,
                    SectionId = symbol.sectionIndex
                };
            }

            Sections = new Section[_layout.data.sectionsCount];
            for (int i = 0; i < _layout.data.sectionsCount; i++)
            {
                SectionLayout section = _layout.data.sections[i];
                int           ind     = 0;

                Sections[i] = new Section()
                {
                    Data   = _layout.data.blobs[section.blobIndex].data,
                    Name   = _layout.data.strings[section.bankNameIndex],
                    Labels = new Label[labelsCount[i]]
                };

                for (int j = 0; j < _layout.data.symbolsCount; j++)
                {
                    if (labels[j].SectionId == i)
                    {
                        Sections[i].Labels[ind++] = labels[j];
                    }
                }
            }
        }
 public RouteTemplateConversion(ModuleLayout ctrl, FIRRTLNode[] nodeOrder, FIRIO[] ioOrder)
 {
     this.Ctrl      = ctrl;
     this.NodeOrder = nodeOrder;
     this.IOOrder   = ioOrder;
 }
예제 #10
0
 public PlaceTemplateConversion(ModuleLayout ctrl, FIRRTLNode[] nodeOrder)
 {
     this.Ctrl      = ctrl;
     this.NodeOrder = nodeOrder;
 }
예제 #11
0
 public void SetLayout(ModuleLayout Layout)
 {
     this.OutputLayout = Layout;
 }