Class: OrigenVerilog::Preprocessor::Processor

Inherits:
OrigenVerilog::Processor show all
Defined in:
lib/origen_verilog/preprocessor/processor.rb

Defined Under Namespace

Classes: Define

Instance Method Summary collapse

Methods inherited from OrigenVerilog::Processor

#handler_missing, #inline, #process, #process_all

Instance Method Details

#on_define(node) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/origen_verilog/preprocessor/processor.rb', line 27

def on_define(node)
  n = node.find(:name)
  name = n.to_a[0]
  if a = n.find(:arguments)
    args = a.to_a
  end
  if n = node.find(:text)
    text = n.to_a.first
  end
  env[name] = Define.new(name: name, args: args, text: text)
  nil
end

#on_else(node) ⇒ Object Also known as: on_elsif



78
79
80
# File 'lib/origen_verilog/preprocessor/processor.rb', line 78

def on_else(node)
  # Do nothing, will be processed by the ifdef handler if required
end

#on_ifdef(node) ⇒ Object Also known as: on_ifndef



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/origen_verilog/preprocessor/processor.rb', line 44

def on_ifdef(node)
  elsif_nodes = node.find_all(:elsif)
  else_node = node.find(:else)
  enable, *nodes = *node
  if node.type == :ifdef ? env[enable] : !env[enable]
    inline(process_all(nodes))
  else
    elsif_nodes.each do |elsif_node|
      enable, *nodes = *elsif_node
      if env[enable]
        return inline(process_all(nodes))
      end
    end
    if else_node
      inline(process_all(else_node.children))
    end
  end
end

#on_include(node) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/origen_verilog/preprocessor/processor.rb', line 9

def on_include(node)
  path = node.to_a[0]
  file = path if File.exist?(path)
  unless file
    dir = ([Dir.pwd] + Array(env[:source_dirs])).find do |dir|
      f = File.join(dir, path)
      File.exist?(f)
    end
    file = File.join(dir, path) if dir
  end
  unless file
    puts "The file #{path} could not be found!"
    puts "#{node.file}:#{node.line_number}"
    exit 1
  end
  inline process(Parser.parse_file(file)).children
end

#on_macro_reference(node) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/origen_verilog/preprocessor/processor.rb', line 64

def on_macro_reference(node)
  if define = env[node.to_a[0]]
    if a = node.find(:arguments)
      args = a.to_a
    end
    node.updated(:text_block, [define.value(node, args)])

  else
    puts "A reference has been made to macro #{node.to_a[0]} but it hasn't been defined yet!"
    puts "#{node.file}:#{node.line_number}"
    exit 1
  end
end

#on_undef(node) ⇒ Object



40
41
42
# File 'lib/origen_verilog/preprocessor/processor.rb', line 40

def on_undef(node)
  env[node.to_a[0]] = nil
end

#run(ast, env) ⇒ Object



4
5
6
7
# File 'lib/origen_verilog/preprocessor/processor.rb', line 4

def run(ast, env)
  @env = env
  process(ast)
end