rips 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15d47ea6c151a478f9748664cb04398ef56a6c25
4
- data.tar.gz: 0bca77b30fa8ab05d24f04dbeb0459ba0ba8b790
3
+ metadata.gz: f9d9774b257b7691b23c8eeb4fcd0b9de10f2515
4
+ data.tar.gz: 9fff56fe4e0eacebfd306b9d4cb4b1dc9a954fe0
5
5
  SHA512:
6
- metadata.gz: b00d78c5c59e542dec762108d82b665bacf262a813e747761a6e2c9618e49f43fecd667c354190e9bf00df26e9acc8aa4115ff527615fc405382054aa631c7a2
7
- data.tar.gz: 44bbf9d40c80f076e3c7a08b6a24f1d1ee4288cce5bc477d7020af0f22b2d968b7f6143f68541a3a95acfc46432296342bdbbef3cf7dcff052beca998dd84d47
6
+ metadata.gz: cfd2de7a53fe4840c1b66c9002c59b8e04f75473471b6fe80020c9b82f79c0c320dd33a8ba9d3f2860804eb1aef16837802c3991647d3e4ec3b7517c3d59a5a0
7
+ data.tar.gz: aef9b647fd23285e73e1de83dff021551a2fe042fa2af82c38e4f81c20ee0cd053fe3c4368221a7fe5151dbfdd95294453b1be16ef4a9b696eeda742210bb281
data/example.rips ADDED
@@ -0,0 +1,3 @@
1
+ li $1, 12
2
+ li $2, 5
3
+ li $2, 1
@@ -23,15 +23,84 @@ module Rips
23
23
 
24
24
  # Analyze and translate each instruction
25
25
  def run
26
+
27
+ @input.each do |line|
28
+
29
+ parse_input(line)
30
+ exists_instruction
31
+
32
+ @instruction = get_instruction
33
+
34
+ argument_size
35
+ argument_syntax
36
+
37
+ @instruction.set_arguments(@cmd[:arguments])
38
+
39
+ show
40
+ @output << @instruction.code
41
+ @line += 1
42
+ end
43
+
44
+ generate
26
45
  end
27
46
 
28
47
  # Codification log of instruction
29
48
  def show
49
+ # Show code with '_' separator
50
+ puts "Code Instruction: " << @instruction.code.scan(/.{4}|.+/).join("_")
30
51
  end
31
52
 
32
53
  # Generate output in "progfile.dat"
33
54
  def generate
34
- end
55
+ File.open("progfile.dat", "w") do |f|
56
+ @output.each do |line|
57
+ f.puts line
58
+ end
59
+ end
60
+ end
61
+
62
+ # Split on tokens
63
+ def parse_input (line)
64
+ @cmd = { name: line.split(' ').first.downcase,
65
+ arguments: line.split(' ',2).pop.delete(' ').split(',') }
66
+ end
35
67
 
68
+ # Obtain instruction's instance object
69
+ def get_instruction
70
+ Object.const_get("Rips::Instructions::#{@cmd[:name].capitalize}").new
71
+ end
72
+
73
+ # Exists instruction in Instruction Set?
74
+ def exists_instruction
75
+ if !Instructions::SET.include? (@cmd[:name])
76
+ Error::message( 4,
77
+ @line,
78
+ @cmd[:name] )
79
+ end
80
+ end
81
+
82
+ # Check number of arguments given with expected by instruction
83
+ def argument_size
84
+ if @cmd[:arguments].size != @instruction.args_number
85
+ Error::message( 5,
86
+ @line,
87
+ @cmd[:name],
88
+ @cmd[:arguments].size,
89
+ @instruction.args_number )
90
+ end
91
+ end
92
+
93
+ # Check if arguments are the same variable type of instruction
94
+ def argument_syntax
95
+ @instruction.variables.each_with_index do |var,i|
96
+ if var.syntax? @cmd[:arguments][i]
97
+ @cmd[:arguments][i] = var.to_i(@cmd[:arguments][i])
98
+ else
99
+ Error::message( 6,
100
+ @line,
101
+ var.error(@cmd[:arguments][i]) )
102
+ end
103
+ end
104
+ end
36
105
  end
37
106
  end
data/lib/rips/error.rb CHANGED
@@ -5,7 +5,10 @@ module Rips
5
5
  [ "RIPS ERROR (0). Unknown problem.",
6
6
  "RIPS ERROR (1). No input file (try `rips file.rips`).",
7
7
  "RIPS ERROR (2). Doesn't exist file or directory.",
8
- "RIPS ERROR (3). Permission denied to read file." ]
8
+ "RIPS ERROR (3). Permission denied to read file.",
9
+ "RIPS ERROR (4). In line %d: doesn't exist `%s` instruction in Instruction Set.",
10
+ "RIPS ERROR (5). In line %d: for `%s` instruction wrong number of arguments (%d for %d).",
11
+ "RIPS ERROR (6). In line %d: syntax error, %s." ]
9
12
 
10
13
  def self.message (num, *args)
11
14
  puts MESSAGES[num] % args
data/lib/rips/formats.rb CHANGED
@@ -0,0 +1 @@
1
+ require "rips/formats/cformat"
@@ -0,0 +1,22 @@
1
+ require "rips/formats/format"
2
+
3
+ module Rips
4
+ module Formats
5
+
6
+ class CFormat < Format
7
+
8
+ attr_reader :args
9
+
10
+ # @args: all instruction's arguments
11
+ def initialize (opcode)
12
+ super(opcode,2)
13
+ @args = {}
14
+ end
15
+
16
+ # Pass all arguments at once
17
+ def set_arguments (args)
18
+ @args[:r1], @args[:r2] = args[1], args[0]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,5 @@
1
+ require "rips/utils"
2
+
1
3
  module Rips
2
4
  module Formats
3
5
 
@@ -0,0 +1 @@
1
+ require "rips/instructions/li"
@@ -8,10 +8,36 @@ module Rips
8
8
  class Instruction
9
9
 
10
10
  # @name: mnemonic name
11
- # @type: instruction format
12
- def initialize (name, type)
13
- @name,@type = name,type
11
+ # @format: instruction format
12
+ def initialize (name, format)
13
+ @name,@format = name,format
14
+ @opcode = format.opcode
14
15
  end
16
+
17
+ # Return number of arguments
18
+ def args_number
19
+ @format.args_number
20
+ end
21
+
22
+ # Pass all arguments at once
23
+ def set_arguments (args)
24
+ @format.set_arguments(args)
25
+ end
26
+
27
+ # Coding to Machine Code
28
+ def code
29
+
30
+ output = [@opcode.to_bin(@opcode.size)]
31
+
32
+ @format.args.each do |key,value|
33
+ output << value.to_bin(@length[key])
34
+ end
35
+
36
+ output.insert(-2,@length[:blank]) if (@length.key? :blank)
37
+
38
+ output.reverse.join.to_s
39
+ end
40
+
15
41
  end
16
42
  end
17
43
  end
@@ -0,0 +1,19 @@
1
+ require "rips/instructions/instruction"
2
+
3
+ module Rips
4
+ module Instructions
5
+
6
+ class Li < Instruction
7
+
8
+ attr_reader :variables, :length
9
+
10
+ # @variables: types of instruction's variables
11
+ # @length: length in bits for each variable
12
+ def initialize
13
+ super("li",Formats::CFormat.new(0b1010))
14
+ @variables = [Variables::Register.new, Variables::Inmediate.new]
15
+ @length = {r2:4, r1:8}
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,6 +1,6 @@
1
1
  module Rips
2
2
  module Instructions
3
3
 
4
- SET = []
4
+ SET = ["li"]
5
5
  end
6
6
  end
data/lib/rips/utils.rb ADDED
@@ -0,0 +1,6 @@
1
+ class Integer
2
+ def to_bin(width)
3
+ num = '%0*b' % [width, self]
4
+ num.gsub('.','1')
5
+ end
6
+ end
@@ -0,0 +1,2 @@
1
+ require "rips/variables/register"
2
+ require "rips/variables/inmediate"
@@ -0,0 +1,35 @@
1
+ require "rips/variables/variable"
2
+
3
+ module Rips
4
+ module Variables
5
+
6
+ class Inmediate < Variable
7
+
8
+ attr_reader :syntax
9
+
10
+ # @syntax: example syntax
11
+ def initialize
12
+ super(8)
13
+ @syntax = "-128...127"
14
+ end
15
+
16
+ # Check input variable syntax
17
+ def syntax? (value)
18
+
19
+ if !number? (value)
20
+ return false
21
+ end
22
+
23
+ value = value.to_i
24
+
25
+ # It should be between syntax range
26
+ if !value.to_i.between?(-2**(@length-1),2**(@length-1)-1)
27
+ return false
28
+ else
29
+ return true
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,45 @@
1
+ require "rips/variables/variable"
2
+
3
+ module Rips
4
+ module Variables
5
+
6
+ class Register < Variable
7
+
8
+ attr_reader :syntax
9
+
10
+ # @syntax: example syntax
11
+ def initialize
12
+ super(4)
13
+ @syntax = "$0-15"
14
+ end
15
+
16
+ # Check input variable syntax
17
+ def syntax? (value)
18
+
19
+ if !register? (value)
20
+ return false
21
+ end
22
+
23
+ # Get integer part
24
+ value = value.split('$',2).last
25
+
26
+ # If contains more "$"
27
+ if value.include? "$"
28
+ return false
29
+ # It should have only 1 or 2 digits
30
+ elsif !value.size.between?(1,2)
31
+ return false
32
+ # If it have 2 digits, first digit doesn't be zero or negative
33
+ elsif (value.size == 2) && (!value[0].match(/-|0/).nil?)
34
+ return false
35
+ # It should be between syntax range
36
+ elsif !value.to_i.between?(0, 2**@length-1)
37
+ return false
38
+ else
39
+ return true
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -9,6 +9,26 @@ module Rips
9
9
  def initialize (length)
10
10
  @length = length
11
11
  end
12
+
13
+ # Check if value is a register ($?)
14
+ def register? (value)
15
+ value[0] == "$"
16
+ end
17
+
18
+ # Check if value is a valid number (...,-1,0,1...)
19
+ def number? (value)
20
+ /\A[-]?\d+\z/ === value
21
+ end
22
+
23
+ # Return integer part of value
24
+ def to_i (value)
25
+ value.split('$',2).last.to_i
26
+ end
27
+
28
+ # Return error message about incorrent syntax
29
+ def error (value)
30
+ "unexpected `#{value}` (expected a `#{self.class.to_s.split(':').last}` argument like `#{@syntax}`)"
31
+ end
12
32
  end
13
33
  end
14
34
  end
data/lib/rips/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rips
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rips
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Madh93
@@ -67,15 +67,21 @@ files:
67
67
  - README.md
68
68
  - Rakefile
69
69
  - bin/rips
70
+ - example.rips
70
71
  - lib/rips.rb
71
72
  - lib/rips/assembler.rb
72
73
  - lib/rips/error.rb
73
74
  - lib/rips/formats.rb
75
+ - lib/rips/formats/cformat.rb
74
76
  - lib/rips/formats/format.rb
75
77
  - lib/rips/instructions.rb
76
78
  - lib/rips/instructions/instruction.rb
79
+ - lib/rips/instructions/li.rb
77
80
  - lib/rips/instructions/set.rb
81
+ - lib/rips/utils.rb
78
82
  - lib/rips/variables.rb
83
+ - lib/rips/variables/inmediate.rb
84
+ - lib/rips/variables/register.rb
79
85
  - lib/rips/variables/variable.rb
80
86
  - lib/rips/version.rb
81
87
  - rips.gemspec