class SOCMaker::VerilogParser

Public Class Methods

new() click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 184
def initialize

end

Public Instance Methods

extract_length( content ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 247
def extract_length( content )

  numeric_regex   = /^\s*([0-9+\-\s]+):([0-9+\-\s]+)/
  parameter_regex = /^\s*(\D[\D\d]+)\s*-\s*1\s*:\s*0/


  content[ :port ].values.each do |port|
    if port[ :range ]
      if m = numeric_regex.match( port[ :range ] )
        tmp = " ( #{ m[1] } ) - ( #{ m[ 2 ] }  ) + 1 "
        begin
          port[ :length ] =  eval( tmp )
        rescue Exception
          port[:length] = 'UNKNOWN'
        end

      elsif m = parameter_regex.match( port[ :range ] )
          port[:length] = m[1]
      end
    else
      port[ :length ] = 1
    end
  end
  return content
end
parse_package( data ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 273
def parse_package( data )
  result = {}
 #data.split("\n").each do |line|
 #end
  return result
end
parse_toplevel( data ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 188
def parse_toplevel( data )
  # remove all newlines
  data = data.gsub( "\n", " " )

  # empty result hash
  result = {}

  module_regex    = /\s*module\s+(\w+)*\s*\(.*?\);/
  port_regex      = /(input|output)\s*(\[([\d\w\-\:\s]*)\s*\])?\s*(\w*);/
  parameter_regex = /parameter\s*(\w*)\s*=\s(.*?);/


  # extract module name
  if m = module_regex.match( data )
    result[ :name ] = m[1]
  else
    result[ :name ] = "unknown"
  end

  #
  # extract parameteters
  #
  parameters = data.scan( parameter_regex )
  result[ :generic ] = {}
  parameters.each do |port|

    result[ :generic ][ port[0] ] = { name: port[0], default: port[1], type: "integer" }

  end

  #
  # extract ports
  #
  ports = data.scan( port_regex )
  result[ :port ] = {}
  ports.each do |port|
    result[ :port ][ port[3] ] = { name: port[3] }


    if port[0] 
      if port[0] == "input"
        result[ :port ][ port[3] ][ :dir ] = "in"
      elsif port[0] == "output"
        result[ :port ][ port[3] ][ :dir ] = "out"
      else
        result[ :port ][ port[3] ][ :dir ] = "in"
      end
    end


    if port[ 2 ]
      result[ :port ][ port[ 3 ] ][ :range ] = port[ 2 ]
    end

  end

  return result
end