Module: Logicuit

Defined in:
lib/logicuit/dsl.rb,
lib/logicuit/runner.rb,
lib/logicuit/version.rb,
lib/logicuit/gates/or.rb,
lib/logicuit/gates/and.rb,
lib/logicuit/gates/not.rb,
lib/logicuit/gates/xor.rb,
lib/logicuit/gates/nand.rb,
lib/logicuit/signals/clock.rb,
lib/logicuit/signals/signal.rb,
lib/logicuit/circuits/td4/cpu.rb,
lib/logicuit/circuits/td4/rom.rb,
lib/logicuit/circuits/td4/decoder.rb,
lib/logicuit/signals/signal_group.rb,
lib/logicuit/array_as_signal_group.rb,
lib/logicuit/circuits/sequential/d_flip_flop.rb,
lib/logicuit/circuits/sequential/one_bit_cpu.rb,
lib/logicuit/circuits/combinational/full_adder.rb,
lib/logicuit/circuits/combinational/half_adder.rb,
lib/logicuit/circuits/sequential/register_4bit.rb,
lib/logicuit/circuits/sequential/program_counter.rb,
lib/logicuit/circuits/combinational/full_adder_4bit.rb,
lib/logicuit/circuits/combinational/multiplexer_2to1.rb,
lib/logicuit/circuits/combinational/multiplexer_4to1.rb

Overview

Logicuit module

Defined Under Namespace

Modules: ArrayAsSignalGroup, Circuits, Gates, Signals Classes: DSL

Constant Summary collapse

VERSION =
"0.3.0"

Class Method Summary collapse

Class Method Details

.run(circuit, hz: 1, noclear: false) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/logicuit/runner.rb', line 5

def self.run(circuit, hz: 1, noclear: false)
  render = lambda {
    system("clear") unless noclear
    puts circuit
    puts
    puts "tick: #{Signals::Clock.tick_count}" if circuit.clock
    puts "input: #{circuit.input_targets.join ","}?" if circuit.input_targets.any?
  }

  if circuit.clock && hz.nonzero?
    Thread.new do
      loop do
        render.call
        sleep 1.0 / hz
        Signals::Clock.tick
      end
    end
  else
    render.call
  end

  while (input = gets.chomp)
    key = input.to_sym
    unless circuit.respond_to? key
      if circuit.clock && hz.zero?
        Signals::Clock.tick
        render.call
      end
      next
    end

    signal = circuit.send(key)
    if signal.current
      signal.off
    else
      signal.on
    end
    render.call
  end
end