Module: OrigenVerilog

Defined in:
lib/origen_verilog.rb,
lib/origen_verilog/node.rb,
lib/origen_verilog/parser.rb,
lib/origen_verilog/processor.rb,
lib/origen_verilog/top_level.rb,
lib/origen_verilog/verilog/node.rb,
lib/origen_verilog/verilog/parser.rb,
lib/origen_verilog/verilog/writer.rb,
lib/origen_verilog/preprocessor/node.rb,
lib/origen_verilog/verilog/evaluator.rb,
lib/origen_verilog/verilog/processor.rb,
lib/origen_verilog/preprocessor/parser.rb,
lib/origen_verilog/preprocessor/writer.rb,
lib/origen_verilog/preprocessor/processor.rb,
lib/origen_verilog/preprocessor/contatenator.rb,
lib/origen_verilog/preprocessor/verilog_parser.rb

Defined Under Namespace

Modules: Preprocessor, Verilog Classes: Extractor, Node, Parser, Processor, TopLevel

Class Method Summary collapse

Class Method Details

.parse_file(files, options = {}) ⇒ Object

Returns an AST for the given file



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/origen_verilog.rb', line 30

def self.parse_file(files, options = {})
  # Assume if multiple files are given, then the last one is the main one to parse, treat those
  # given up front as equivalent to including them within the main file via a compiler directive
  files = files.split(/\s/)
  file = files.pop

  top_dir = Pathname.new(file).dirname.to_s
  options[:source_dirs] ||= []
  options[:source_dirs] << top_dir unless options[:source_dirs].include?(top_dir)

  # Read in the file to a pre-processor AST (Verilog captured as blocks of text at this point)
  ast = Preprocessor::Parser.parse_file(file, options)
  unless files.empty?
    files.each do |f|
      ast = ast.updated(nil, [ast.updated(:include, [f])] + ast.children)
    end
  end

  Array(options[:defines]).each do |define|
    name, text = *define.split('=')
    name = ast.updated(:name, [name])
    nodes = [name]
    nodes << ast.updated(:text, [text]) if text
    ast = ast.updated(nil, [ast.updated(:define, nodes)] + ast.children)
  end

  # Evaluate all compiler directives
  ast = ast.process(options)
  # Now parse as Verilog
  ast = ast.parse_verilog(options.merge(file: file))
end