/// <summary>
 /// Initializes a default intance of the TypeAliasCollection with aliases for primitive types
 /// </summary>
 public TypeAliasCollection()
 {
     this.bindings     = new TwoWayDictionary <Type, string>();
     this.assemblyList = new List <Assembly>();
     AddDefaultAliases();
     AddDefaultAssemblies();
 }
 /// <summary>
 /// Initializes a default intance of the TypeAliasCollection with aliases for primitive types
 /// </summary>
 public TypeAliasCollection()
 {
     this.bindings = new TwoWayDictionary<Type, string>();
     this.assemblyList = new List<Assembly>();
     AddDefaultAliases();
     AddDefaultAssemblies();
 }
        public RiscV(string cpuType, long frequency, Machine machine, PrivilegeMode privilegeMode = PrivilegeMode.Priv1_10, Endianess endianness = Endianess.LittleEndian) : base(cpuType, machine, endianness)
        {
            InnerTimer = new ComparingTimer(machine.ClockSource, frequency, enabled: true, eventEnabled: true);

            intTypeToVal = new TwoWayDictionary <int, IrqType>();
            intTypeToVal.Add(0, IrqType.MachineTimerIrq);
            intTypeToVal.Add(1, IrqType.MachineExternalIrq);
            intTypeToVal.Add(2, IrqType.MachineSoftwareInterrupt);

            var architectureSets = DecodeArchitecture(cpuType);

            foreach (var @set in architectureSets)
            {
                if (Enum.IsDefined(typeof(InstructionSet), set))
                {
                    TlibAllowFeature((uint)set);
                }
                else if ((int)set == 'G' - 'A')
                {
                    //G is a wildcard denoting multiple instruction sets
                    foreach (var gSet in new [] { InstructionSet.I, InstructionSet.M, InstructionSet.F, InstructionSet.D, InstructionSet.A })
                    {
                        TlibAllowFeature((uint)gSet);
                    }
                }
                else
                {
                    this.Log(LogLevel.Warning, $"Undefined instruction set: {char.ToUpper((char)(set + 'A'))}.");
                }
            }
            TlibSetPrivilegeMode109(privilegeMode == PrivilegeMode.Priv1_09 ? 1 : 0u);
        }
Exemple #4
0
        protected Layout <TRoom> TransformLayout(IMapLayout <TRoom> layout, TwoWayDictionary <IRoomDescription, GameObject> roomDescriptionsToRoomTemplates)
        {
            var roomTransformations = new RoomTransformations();

            // Prepare an object to hold instantiated room templates
            var parentGameObject = new GameObject("Room template instances");

            parentGameObject.transform.parent = Payload.GameObject.transform;

            // Initialize rooms
            var layoutData = new Dictionary <TRoom, RoomInfo <TRoom> >();

            foreach (var layoutRoom in layout.Rooms)
            {
                var roomTemplate = roomDescriptionsToRoomTemplates[layoutRoom.RoomDescription];

                // Instatiate room template
                var room = Object.Instantiate(roomTemplate);
                room.SetActive(false);
                room.transform.SetParent(parentGameObject.transform);

                // Transform room template if needed
                var transformation = layoutRoom.Transformation;
                roomTransformations.Transform(room, transformation);

                // Compute correct room position
                // We cannot directly use layoutRoom.Position because the dungeon moves
                // all room shapes in a way that they are in the first plane quadrant
                // and touch the xy axes. So we have to subtract the original lowest
                // x and y coordinates.
                var smallestX       = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.X);
                var smallestY       = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.Y);
                var correctPosition = layoutRoom.Position.ToUnityIntVector3() - new Vector3Int(smallestX, smallestY, 0);
                room.transform.position = correctPosition;

                var roomInfo = new RoomInfo <TRoom>(roomTemplate, room, correctPosition, TransformDoorInfo(layoutRoom.Doors),
                                                    layoutRoom.IsCorridor, layoutRoom);

                room.transform.position = new Vector3(room.transform.position.x * 32, room.transform.position.y * 16, 0);
                //room.gameObject.SetActive(true);

                foreach (Transform child in room.transform)
                {
                    if (child.gameObject.tag == "object")
                    {
                        var pos = child.transform.localPosition;
                        child.transform.SetParent(room.transform.parent);
                        child.transform.localScale = new Vector3(1, 1, 0);
                        child.transform.position   = new Vector3(room.transform.position.x + pos.x, room.transform.position.y + pos.y, 0);
                    }
                }

                room.transform.localScale = new Vector3(1, 1, 0);

                layoutData.Add(layoutRoom.Node, roomInfo);
            }

            return(new Layout <TRoom>(layoutData));
        }
 static PropertySerializationTypeConverter()
 {
     _serializationTypesStringMap = new TwoWayDictionary <PropertySerializationType, string> ();
     _serializationTypesStringMap.Add(PropertySerializationType.CamelCase, "camelCase");
     _serializationTypesStringMap.Add(PropertySerializationType.LowerSnakeCase, "lower_snake_case");
     _serializationTypesStringMap.Add(PropertySerializationType.PascalCase, "PascalCase");
     _serializationTypesStringMap.Add(PropertySerializationType.UnderscoreCamelCase, "_underscoreCamelCase");
 }
Exemple #6
0
        public void ReversingTwoWayDictionaryTwiceResultsInFirstDictionary()
        {
            var original = new TwoWayDictionary <string, int>();

            var doubleReversed = original.Reversed.Reversed;

            doubleReversed.ShouldBeSameAs(original);
        }
Exemple #7
0
        public override void Process()
        {
            RoomDescriptionsToRoomTemplates = new TwoWayDictionary <IRoomDescription, GameObject>();
            RoomShapesLoader = new RoomShapesLoader();

            Payload.MapDescription = SetupMapDescription();
            Payload.RoomDescriptionsToRoomTemplates = RoomDescriptionsToRoomTemplates;
        }
        public void Indexer_EntryExists_ReturnsExpectedEntry()
        {
            var dictionary = new TwoWayDictionary <string, int>
            {
                ["id"] = 5,
            };

            Assert.AreEqual(dictionary["id"], 5);
        }
Exemple #9
0
        public void AddingASingleItemResultsInACountOfOne()
        {
            var left     = Guid.NewGuid().ToString();
            var right    = Guid.NewGuid().GetHashCode();
            var original = new TwoWayDictionary <string, int> {
                { left, right }
            };

            original.Count.ShouldBe(1);
        }
Exemple #10
0
 public BasicLayoutConverterGrid2D(
     LevelDescriptionGrid2D <TNode> mapDescription,
     ConfigurationSpacesGrid2D <TConfiguration, RoomNode <TNode> > configurationSpaces,
     TwoWayDictionary <RoomTemplateInstanceGrid2D, IntAlias <PolygonGrid2D> > intAliasMapping
     )
 {
     MapDescription      = mapDescription;
     ConfigurationSpaces = configurationSpaces;
     IntAliasMapping     = intAliasMapping;
 }
 public BasicLayoutConverter(
     MapDescriptionMapping <TNode> mapDescription,
     IConfigurationSpaces <int, IntAlias <PolygonGrid2D>, TConfiguration, ConfigurationSpace> configurationSpaces,
     TwoWayDictionary <RoomTemplateInstance, IntAlias <PolygonGrid2D> > intAliasMapping
     )
 {
     MapDescription      = mapDescription;
     ConfigurationSpaces = configurationSpaces;
     IntAliasMapping     = intAliasMapping;
 }
Exemple #12
0
        public void ValueFromOriginalShouldBeUsableAsKeyInReversed()
        {
            var left     = Guid.NewGuid().ToString();
            var right    = Guid.NewGuid().GetHashCode();
            var original = new TwoWayDictionary <string, int> {
                { left, right }
            };

            original[left].ShouldBe(right);
            original.Reversed[right].ShouldBe(left);
        }
        public static TwoWayDictionary <TElement, int> CreateIntMapping <TElement>(this IEnumerable <TElement> elements)
        {
            var mapping = new TwoWayDictionary <TElement, int>();

            foreach (var element in elements)
            {
                mapping.Add(element, mapping.Count);
            }

            return(mapping);
        }
Exemple #14
0
        public RevolutionWorld(int entityInitialCapacity = 0)
        {
            lastEntity = default;

            Chunks = new RevolutionChunk[1];
            // the first chunk has no component
            Chunks[0] = new RevolutionChunk(new Type[0]);

            entityToChunk      = new Dictionary <RawEntity, RevolutionChunk>(entityInitialCapacity);
            identifierToEntity = new TwoWayDictionary <EntityIdentifier, RawEntity>(entityInitialCapacity);
        }
        public static TwoWayDictionary <TKey, TValue> ToTwoWayDictionary <TKey, TValue>(this IDictionary <TKey, TValue> dictionary)
        {
            var twoWayDictionary = new TwoWayDictionary <TKey, TValue>();

            foreach (var pair in dictionary)
            {
                twoWayDictionary.Add(pair.Key, pair.Value);
            }

            return(twoWayDictionary);
        }
        public int Count_ReturnsExpectedValue(int entriesToAdd)
        {
            var dictionary = new TwoWayDictionary <string, int>();

            for (var i = 0; i < entriesToAdd; i++)
            {
                dictionary.Add(i.ToString(), i);
            }

            return(dictionary.Count);
        }
Exemple #17
0
        /// <summary>
        /// Returns the mapping from original vertices to ints.
        /// </summary>
        /// <returns></returns>
        public virtual TwoWayDictionary <TNode, int> GetRoomsMapping()
        {
            IsLocked = true;
            var mapping = new TwoWayDictionary <TNode, int>();

            foreach (var pair in Rooms)
            {
                mapping.Add(pair.Key, pair.Value);
            }

            return(mapping);
        }
        public void EnsureBothDirections()
        {
            var dictionary = new TwoWayDictionary <int, int>();

            dictionary.Add(1, 2);

            Assert.True(dictionary.ContainsKey(1));
            Assert.True(dictionary.ContainsValue(2));
            Assert.False(dictionary.ContainsKey(2));
            Assert.False(dictionary.ContainsValue(1));
            Assert.Equal(2, dictionary[1]);
            Assert.Equal(1, dictionary.Reverse[2]);
        }
Exemple #19
0
        public RoomShapesHandlerGrid2D(
            TwoWayDictionary <RoomTemplateInstanceGrid2D, IntAlias <PolygonGrid2D> > intAliasMapping,
            ILevelDescription <TNode> mapDescription, Dictionary <TNode, List <WeightedShape> > shapesForNodes, RoomTemplateRepeatMode?repeatModeOverride = null, RoomTemplateRepeatMode?repeatModeDefault = null)
        {
            this.intAliasMapping    = intAliasMapping;
            this.mapDescription     = mapDescription;
            this.shapesForNodes     = shapesForNodes;
            this.repeatModeDefault  = repeatModeDefault;
            this.repeatModeOverride = repeatModeOverride;
            graphWithoutCorridors   = mapDescription.GetGraphWithoutCorridors();

            Initialize();
        }
    static PriorRollsLineHelper()
    {
      _fieldMappings = new TwoWayDictionary<PriorRollsLineField, string>();

      foreach (var prop in typeof(PriorRollsLine).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty))
      {
        var att = AttributeHelper.GetSingleAttribute<PriorRollsFieldAttribute>(prop);

        if (att == null) continue;

        Mappings.Add(att.Field, prop.Name);
      }
    }
        private Dictionary <int, List <int> > GetInitialClusters(TwoWayDictionary <TLayout, int> layouts)
        {
            var clusters = new Dictionary <int, List <int> >();

            foreach (var pair in layouts)
            {
                clusters.Add(clusters.Count, new List <int>()
                {
                    pair.Value
                });
            }

            return(clusters);
        }
        public RoomShapesHandler(
            IConfigurationSpaces <TNode, IntAlias <PolygonGrid2D>, TConfiguration, ConfigurationSpace> configurationSpaces,
            TwoWayDictionary <RoomTemplateInstance, IntAlias <PolygonGrid2D> > intAliasMapping,
            IMapDescription <TNode> mapDescription,
            RoomTemplateRepeatMode?repeatModeOverride = null)
        {
            this.configurationSpaces = configurationSpaces;
            this.intAliasMapping     = intAliasMapping;
            this.mapDescription      = mapDescription;
            this.repeatModeOverride  = repeatModeOverride;
            stageOneGraph            = mapDescription.GetStageOneGraph();

            Initialize();
        }
Exemple #23
0
        private bool RegisterType(TwoWayDictionary <Type, MessageDescriptor> registeredTypes, Type type)
        {
            lock (_lock)
            {
                if (!registeredTypes.ContainsKey(type) && TryGetDescriptorFromAttribute(type, out var descriptor))
                {
                    registeredTypes.Add(type, descriptor);

                    return(true);
                }

                return(false);
            }
        }
Exemple #24
0
        public void ClearingATwoWayDictionaryShouldAlsoClearItsReverse()
        {
            var original = new TwoWayDictionary <string, int> {
                { "one", 1 }
            };

            original.Count.ShouldBe(1);
            original.Reversed.Count.ShouldBe(1);

            original.Clear();

            original.Count.ShouldBe(0);
            original.Reversed.Count.ShouldBe(0);
        }
Exemple #25
0
        protected override MapDescription <int> SetupMapDescription()
        {
            if (Config.LevelGraph == null)
            {
                throw new ArgumentException("LevelGraph must not be null.");
            }

            RoomToIntMapping = new TwoWayDictionary <Room, int>();
            var mapDescription = new MapDescription <int>();

            mapDescription.SetDefaultTransformations(new List <Transformation>()
            {
                Transformation.Identity
            });

            // Setup individual rooms
            foreach (var room in Config.LevelGraph.Rooms)
            {
                RoomToIntMapping.Add(room, RoomToIntMapping.Count);
                mapDescription.AddRoom(RoomToIntMapping[room]);
                SetupRoomShapesForRoom(mapDescription, room);
            }

            // Add default room shapes
            SetupDefaultRoomShapes(mapDescription, Config.LevelGraph);

            // Add corridors
            if (Config.UseCorridors)
            {
                SetupCorridorRoomShapes(mapDescription, Config.LevelGraph);
            }

            // Add passages
            foreach (var connection in Config.LevelGraph.Connections)
            {
                var from = RoomToIntMapping[connection.From];
                var to   = RoomToIntMapping[connection.To];

                mapDescription.AddPassage(from, to);
            }

            if (Payload is IRoomToIntMappingPayload <Room> payloadWithMapping)
            {
                payloadWithMapping.RoomToIntMapping = RoomToIntMapping;
            }

            return(mapDescription);
        }
        private void InitMembers()
        {
            presetButtonDict = new TwoWayDictionary <UAnchorPreset, Button>();
            presetButtonDict.Add(UAnchorPreset.TopLeft, AnchorTopLeftButton);
            presetButtonDict.Add(UAnchorPreset.TopMid, AnchorTopMidButton);
            presetButtonDict.Add(UAnchorPreset.TopRight, AnchorTopRightButton);
            presetButtonDict.Add(UAnchorPreset.MidLeft, AnchorMidLeftButton);
            presetButtonDict.Add(UAnchorPreset.MidMid, AnchorMidMidButton);
            presetButtonDict.Add(UAnchorPreset.MidRight, AnchorMidRightButton);
            presetButtonDict.Add(UAnchorPreset.BotLeft, AnchorBotLeftButton);
            presetButtonDict.Add(UAnchorPreset.BotMid, AnchorBotMidButton);
            presetButtonDict.Add(UAnchorPreset.BotRight, AnchorBotRightButton);

            presetButtonDict.Add(UAnchorPreset.StretchLeft, AnchorStretchLeftButton);
            presetButtonDict.Add(UAnchorPreset.StretchMid, AnchorStretchMidButton);
            presetButtonDict.Add(UAnchorPreset.StretchRight, AnchorStretchRightButton);
            presetButtonDict.Add(UAnchorPreset.TopStretch, AnchorTopStretchButton);
            presetButtonDict.Add(UAnchorPreset.MidStretch, AnchorMidStretchButton);
            presetButtonDict.Add(UAnchorPreset.BotStretch, AnchorBotStretchButton);

            presetButtonDict.Add(UAnchorPreset.StretchAll, AnchorStretchAllButton);

            anchorButtons = new Button[] {
                AnchorTopLeftButton,
                AnchorTopMidButton,
                AnchorTopRightButton,
                AnchorMidLeftButton,
                AnchorMidMidButton,
                AnchorMidRightButton,
                AnchorBotLeftButton,
                AnchorBotMidButton,
                AnchorBotRightButton,

                AnchorStretchLeftButton,
                AnchorStretchMidButton,
                AnchorStretchRightButton,
                AnchorTopStretchButton,
                AnchorMidStretchButton,
                AnchorBotStretchButton,

                AnchorStretchAllButton,
            };
        }
        public PSE_USB(Machine machine, ControllerMode mode = ControllerMode.Host) : base(machine)
        {
            this.mode = mode;

            addressToDeviceCache = new TwoWayDictionary <byte, IUSBDevice>();

            fifoFromDeviceToHost         = new Queue <byte> [NumberOfEndpoints];
            fifoFromHostToDevice         = new Queue <byte> [NumberOfEndpoints];
            receiveDeviceAddress         = new IValueRegisterField[NumberOfEndpoints];
            transmitDeviceAddress        = new IValueRegisterField[NumberOfEndpoints];
            requestInTransaction         = new IFlagRegisterField[NumberOfEndpoints];
            transmitTargetEndpointNumber = new IValueRegisterField[NumberOfEndpoints];
            receiveTargetEndpointNumber  = new IValueRegisterField[NumberOfEndpoints];

            for (var i = 0; i < NumberOfEndpoints; i++)
            {
                fifoFromDeviceToHost[i] = new Queue <byte>();
                fifoFromHostToDevice[i] = new Queue <byte>();
            }

            MainIRQ = new GPIO();
            DmaIRQ  = new GPIO();

            byteRegisters       = new ByteRegisterCollection(this);
            wordRegisters       = new WordRegisterCollection(this);
            doubleWordRegisters = new DoubleWordRegisterCollection(this);

            var gate = new GPIOGate(MainIRQ);

            usbInterruptsManager = new InterruptManager <UsbInterrupt>(this, gate.GetGPIO(), "main");
            txInterruptsManager  = new InterruptManager <TxInterrupt>(this, gate.GetGPIO(), "main");
            rxInterruptsManager  = new InterruptManager <RxInterrupt>(this, gate.GetGPIO(), "main");

            DefineCommonRegisters();
            DefineIndexedRegisters();
            DefineFifoRegisters();
            DefineControlAndStatusRegisters();
            DefineNonIndexedEndpointControlAndStatusRegisters();
            DefineMultipointControlAndStatusRegisters();

            ResetInterrupts();
        }
        private double[][] GetLayoutDistanceMatrix(TwoWayDictionary <TLayout, int> layouts, GetDistanceDelegate <TLayout> getDistance)
        {
            var distanceMatrix = new double[layouts.Count][];

            for (int i = 0; i < layouts.Count; i++)
            {
                distanceMatrix[i] = new double[layouts.Count];
            }

            for (int i = 0; i < layouts.Count - 1; i++)
            {
                for (int j = i + 1; j < layouts.Count; j++)
                {
                    var distance = getDistance(layouts.GetByValue(i), layouts.GetByValue(j));
                    distanceMatrix[i][j] = distance;
                    distanceMatrix[j][i] = distance;
                }
            }

            return(distanceMatrix);
        }
        protected override MapDescription <int> SetupMapDescription()
        {
            RoomToIntMapping = new TwoWayDictionary <Room, int>();
            LevelGraph       = new UndirectedAdjacencyListGraph <Room>();
            MapDescription   = new MapDescription <int>();

            // Transformations of room shapes currently not available
            MapDescription.SetDefaultTransformations(new List <Transformation>()
            {
                Transformation.Identity
            });

            // Get random length of the main path
            var mainPathLength = Payload.Random.Next(Config.MinLength, Config.MaxLength);

            // Add vertices on the main path
            var mainPath = SetupMainPath(mainPathLength);

            // Add shortcut
            if (Config.AddShortcuts)
            {
                SetupShortcut(mainPath);
            }

            // Add redundant rooms
            if (Config.AddRedundantRooms)
            {
                SetupRedundantRooms();
            }

            // Setup map description rooms and connections
            SetupMapDescriptionFromLevelGraph();

            // Setup room templates
            SetupRoomTemplates();

            Payload.RoomToIntMapping = RoomToIntMapping;

            return(MapDescription);
        }
 /// <summary>
 /// Initializes a default intance of the TypeAliasCollection with aliases for primitive types
 /// </summary>
 public TypeAliasCollection()
 {
     this.bindings = new TwoWayDictionary<Type, string>();
     AddDefaultAliases();
 }
Exemple #31
0
        /// <inheritdoc />
        /// <remarks>
        /// Adds number to a given prefix until all corridors have a name.
        /// </remarks>
        public void AddCorridorsToMapping(ICorridorMapDescription <int> mapDescription, TwoWayDictionary <string, int> mapping)
        {
            var graph     = mapDescription.GetGraph();
            var corridors = graph.Vertices.Where(mapDescription.IsCorridorRoom).ToList();

            var counter = 0;

            foreach (var corridor in corridors)
            {
                while (true)
                {
                    var name = prefix + counter;

                    if (!mapping.ContainsKey(name))
                    {
                        mapping.Add(name, corridor);
                        break;
                    }

                    counter++;
                }
            }
        }
Exemple #32
0
        public MiV_CoreGPIO(Machine machine) : base(machine, NumberOfInterrupts)
        {
            innerLock = new object();
            IRQ       = new GPIO();

            irqManager = new GPIOInterruptManager(IRQ, State);

            var registersMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.OutputRegister, new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Write, writeCallback: (_, value) =>
                    {
                        lock (innerLock)
                        {
                            var bits = BitHelper.GetBits(value);
                            for (var i = 0; i < bits.Length; i++)
                            {
                                Connections[i].Set(bits[i]);
                            }
                        }
                    }) },

                { (long)Registers.InputRegister, new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ =>
                    {
                        lock (innerLock)
                        {
                            return(BitHelper.GetValueFromBitsArray(State));
                        }
                    }) },

                { (long)Registers.InterruptClearRegister, new DoubleWordRegister(this).WithValueField(0, 32, writeCallback: (_, value) =>
                    {
                        lock (innerLock)
                        {
                            foreach (var i in BitHelper.GetSetBits(value))
                            {
                                irqManager.ClearInterrupt((uint)i);
                            }
                        }
                    }, valueProviderCallback: _ => {
                        lock (innerLock)
                        {
                            return(BitHelper.GetValueFromBitsArray(irqManager.ActiveInterrupts));
                        }
                    }) }
            };

            var intTypeToVal = new TwoWayDictionary <GPIOInterruptManager.InterruptTrigger, uint>();

            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.ActiveHigh, 0);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.ActiveLow, 1);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.RisingEdge, 2);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.FallingEdge, 3);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.BothEdges, 4);

            for (var i = 0; i < NumberOfInterrupts; i++)
            {
                var j = i;
                registersMap.Add((long)Registers.ConfigurationRegisterBase + i * 0x4, new DoubleWordRegister(this)
                                 .WithFlag(0, writeCallback: (_, v) =>
                {
                    if (v)
                    {
                        irqManager.PinDirection[j] |= GPIOInterruptManager.Direction.Output;
                    }
                    else
                    {
                        irqManager.PinDirection[j] &= ~GPIOInterruptManager.Direction.Output;
                    }
                },
                                           valueProviderCallback: _ => (irqManager.PinDirection[j] & GPIOInterruptManager.Direction.Output) != 0, name: "OUTREG")
                                 .WithFlag(1, writeCallback: (_, value) =>
                {
                    if (value)
                    {
                        irqManager.PinDirection[j] |= GPIOInterruptManager.Direction.Input;
                    }
                    else
                    {
                        irqManager.PinDirection[j] &= ~GPIOInterruptManager.Direction.Input;
                    }
                },
                                           valueProviderCallback: _ => (irqManager.PinDirection[j] & GPIOInterruptManager.Direction.Input) != 0, name: "INREG")
                                 .WithTag("OUTBUFF", 2, 1)
                                 .WithFlag(3, writeCallback: (_, v) => { irqManager.InterruptEnable[j] = v; }, valueProviderCallback: _ => irqManager.InterruptEnable[j], name: "INTENABLE")
                                 //bit 4 unused
                                 .WithValueField(5, 3, writeCallback: (_, value) =>
                {
                    if (!intTypeToVal.TryGetValue(value, out var type))
                    {
                        this.Log(LogLevel.Warning, "Invalid interrupt type for pin #{0}: {1}", j, value);
                        return;
                    }
                    irqManager.InterruptType[j] = type;
                }, valueProviderCallback: _ =>
                {
                    if (!intTypeToVal.TryGetValue(irqManager.InterruptType[j], out var value))
                    {
                        throw new ArgumentOutOfRangeException($"Unknown interrupt trigger type: {irqManager.InterruptType[j]}");
                    }
                    return(value);
                }, name: "INTTYPE"));
            }

            registers = new DoubleWordRegisterCollection(this, registersMap);
        }
Exemple #33
0
        public PSE_GPIO(Machine machine) : base(machine, 32)
        {
            locker     = new object();
            IRQ        = new GPIO();
            irqManager = new GPIOInterruptManager(IRQ, State);

            var registersMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.InterruptRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 32,
                                  writeCallback: (_, val) =>
                    {
                        foreach (var i in BitHelper.GetSetBits(val))
                        {
                            irqManager.ClearInterrupt(i);
                            if ((irqManager.PinDirection[i] & GPIOInterruptManager.Direction.Input) != 0)
                            {
                                Connections[i].Set(false);
                            }
                        }
                    },
                                  valueProviderCallback: _ => BitHelper.GetValueFromBitsArray(irqManager.ActiveInterrupts), name: "INTR") },

                { (long)Registers.InputRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 32, out inputReg, FieldMode.Read,
                                  valueProviderCallback: val =>
                    {
                        var pins   = irqManager.PinDirection.Select(x => (x & GPIOInterruptManager.Direction.Input) != 0);
                        var result = pins.Zip(State, (pin, state) => pin && state);
                        return(BitHelper.GetValueFromBitsArray(result));
                    }, name: "GPIN") },

                { (long)Registers.OutputRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 32,
                                  valueProviderCallback: val =>
                    {
                        var pins   = irqManager.PinDirection.Select(x => (x & GPIOInterruptManager.Direction.Output) != 0);
                        var result = pins.Zip(Connections.Values, (pin, state) => pin && state.IsSet);
                        return(BitHelper.GetValueFromBitsArray(result));
                    },
                                  writeCallback: (_, val) =>
                    {
                        // Potentially we should raise an exception, as GPIO is bidirectional,
                        // but we do not have such infrastructure.
                        var bits = BitHelper.GetBits(val);
                        for (var i = 0; i < bits.Length; i++)
                        {
                            if ((irqManager.PinDirection[i] & GPIOInterruptManager.Direction.Output) != 0)
                            {
                                Connections[i].Set(bits[i]);
                            }
                        }
                    }, name: "GPOUT") },

                { (long)Registers.ClearRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 32, writeCallback: (_, val) => SetRegisterBits(val, false), name: "CLEAR_BITS") },

                { (long)Registers.SetRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 32, writeCallback: (_, val) => SetRegisterBits(val, true), name: "SET_BITS") },
            };

            var intTypeToVal = new TwoWayDictionary <GPIOInterruptManager.InterruptTrigger, uint>();

            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.ActiveHigh, 0);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.ActiveLow, 1);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.RisingEdge, 2);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.FallingEdge, 3);
            intTypeToVal.Add(GPIOInterruptManager.InterruptTrigger.BothEdges, 4);

            for (var i = 0; i < RegisterLength; i++)
            {
                var j = i;
                registersMap.Add(i * RegisterOffset, new DoubleWordRegister(this)
                                 .WithFlag(0,
                                           writeCallback: (_, val) =>
                {
                    if (val)
                    {
                        irqManager.PinDirection[j] |= GPIOInterruptManager.Direction.Output;
                    }
                    else
                    {
                        irqManager.PinDirection[j] &= ~GPIOInterruptManager.Direction.Output;
                    }
                },
                                           valueProviderCallback: _ => (irqManager.PinDirection[j] & GPIOInterruptManager.Direction.Output) != 0, name: "OutputRegEnable")
                                 .WithFlag(1,
                                           writeCallback: (_, value) =>
                {
                    if (value)
                    {
                        irqManager.PinDirection[j] |= GPIOInterruptManager.Direction.Input;
                    }
                    else
                    {
                        irqManager.PinDirection[j] &= ~GPIOInterruptManager.Direction.Input;
                    }
                },
                                           valueProviderCallback: _ => (irqManager.PinDirection[j] & GPIOInterruptManager.Direction.Input) != 0, name: "InputRegEnable")
                                 .WithTag("OutputBufferEnable", 2, 1)
                                 .WithFlag(3, writeCallback: (_, v) => { irqManager.InterruptEnable[j] = v; }, valueProviderCallback: _ => irqManager.InterruptEnable[j], name: "InterruptEnable")
                                 .WithReservedBits(4, 1)
                                 .WithValueField(5, 3,
                                                 writeCallback: (_, value) =>
                {
                    if (!intTypeToVal.TryGetValue(value, out var type))
                    {
                        this.Log(LogLevel.Warning, "Invalid interrupt type for pin #{0}: {1}", j, value);
                        return;
                    }
                    irqManager.InterruptType[j] = type;
                },
                                                 valueProviderCallback: _ => intTypeToVal[irqManager.InterruptType[j]], name: "InterruptType"));
            }
            registers = new DoubleWordRegisterCollection(this, registersMap);
        }
 public void TestInitialize()
 {
     Dict = new TwoWayDictionary<string, string>();
 }