16-битная логика / компьютерное моделирование в Swift - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь сделать базовую симуляцию 16-битного компьютера с помощью Swift.Компьютер будет иметь

  • АЛУ
  • 2 регистра

Вот и все.У меня достаточно знаний, чтобы визуально создавать эти части и понимать, как они работают, но при использовании моего текущего подхода становится все труднее создавать более крупные компоненты с большим количеством входных данных.

В настоящее время мой подход заключается в том, чтобы обернуть каждый компонент вstruct.Это сработало на раннем этапе, но становится все труднее управлять несколькими входами, оставаясь верным принципам информатики.

Основная проблема заключается в том, что компоненты не обновляются с тактовым сигналом.У меня есть выход обновления компонента, когда get вызывается для выходной переменной, c.Это, однако, пренебрегает идеей тактового сигнала и, вероятно, вызовет дальнейшие проблемы в дальнейшем.

Также трудно создавать методы получения и установки для каждой переменной, не получая ошибок об изменчивости.Хотя я работал над этими ошибками, они раздражают и замедляют процесс разработки.

Последняя большая проблема - обновление вывода.Выход не обновляется при изменении входных данных;он обновляется, когда сказано сделать это.Это не соответствует качествам реальных компьютеров и является фундаментальной ошибкой.

Это пример.Это АЛУ, о котором я упоминал ранее.Требуется два 16-битных входа и 16-битных выхода.У него есть два одинарных ALU, которые могут обнулить 16-битное число, отрицать его или оба.Наконец, он либо добавляет, либо делает немного мудрее и сравнивает на основе флага f и инвертирует вывод, если выбран флаг no.

struct ALU {
    //Operations are done in the order listed. For example, if zx and nx are 1, it first makes input 1 zero and then inverts it.
    var x : [Int] //Input 1
    var y : [Int] //Input 2
    var zx : Int //Make input 1 zero
    var zy : Int //Make input 2 zero
    var nx : Int //Invert input 1
    var ny : Int //Invert input 2
    var f : Int //If 0, do a bitwise AND operation. If 1, add the inputs
    var no : Int //Invert the output
    public var c : [Int] { //Output
        get {
            //Numbers first go through unary ALUs. These can negate the input (and output the value), return 0, or return the inverse of 0. They then undergo the operation specified by f, either addition or a bitwise and operation, and are negated if n is 1.
            var ux = UnaryALU(z: zx, n: nx, x: x).c //Unary ALU. See comments for more
            var uy = UnaryALU(z: zy, n: ny, x: y).c 
            var fd = select16(s: f, d1: Add16(a: ux, b: uy).c, d0: and16(a: ux, b: uy).c).c //Adds a 16 bit number or does a bitwise and operation. For more on select16, see the line below.
            var out = select16(s: no, d1: not16(a: fd).c, d0: fd).c //Selects a number. If s is 1, it returns d1. If s is 0, it returns d0. d0 is the value returned by fd, while d1 is the inverse.
            return out
        }
    }
    public init(x:[Int],y:[Int],zx:Int,zy:Int,nx:Int,ny:Int,f:Int,no:Int) {
        self.x = x
        self.y = y
        self.zx = zx
        self.zy = zy
        self.nx = nx
        self.ny = ny
        self.f = f
        self.no = no
    }
}

Я использую c для выходной переменнойхранить значения с несколькими битами в массивах Int и сохранять отдельные биты в значениях Int.

Я делаю это на Swift Playgrounds 3.0 с Swift 5.0 на iPad 6-го поколения.Я храню каждый компонент или набор компонентов в отдельном файле в модуле, поэтому некоторые переменные и все structs помечены public.Я был бы очень признателен за любую помощь.Заранее спасибо.

...