class SOCMaker::HDLParser

Public Class Methods

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

end

Public Instance Methods

get_all_hdl_files( files ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 71
def get_all_hdl_files( files )
  hdl_files = []
  files.each { |f|   hdl_files += Dir[f] }
  return hdl_files
end
get_content( file ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 62
def get_content( file )
  return File.open( file, "r"){ |f| f.read }
end
get_extension( file ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 67
def get_extension( file )
  return File.extname( file )
end
parse_core( top_file, files, package_file = nil ) click to toggle source
# File lib/soc_maker/hdl_parser.rb, line 80
def parse_core( top_file, files, package_file = nil )

  files = [ files ] if not files.kind_of?( Array )

  #
  # read and parse toplevel file
  #
  content = get_content( top_file )
  if get_extension( top_file ) == ".v" 
    toplevel = VerilogParser.instance.parse_toplevel( content )
    toplevel = VerilogParser.instance.extract_length( toplevel )
  elsif get_extension( top_file ) == ".vhd"
    toplevel = VHDLParser.instance.parse_toplevel( content )
    toplevel = VHDLParser.instance.extract_length( toplevel )
  end

  #
  # read and parse package file
  #
  #   -> not yet supported
  #
  if package_file != nil
    content = get_content( package_file )
    if get_extension( package_file ) == ".v"
      package = VerilogParser.instance.parse_package( content )
    elsif get_extension( top_file ) == ".vhd"
      package = VerilogParser.instance.parse_package( content )
    end
  else
    package = {}
  end


  #
  # get all HDL files
  #
  hdl_files = get_all_hdl_files( files )



  #
  # Prepare options and ports hashes
  #
  options = { 'inst_parameters' => {},
              'hdlfiles'        => {},
              'interfaces'      => {} }

  if toplevel.has_key?( :generic )
    toplevel[ :generic ].values.each do | v |
      options[ 'inst_parameters' ][ v[:name] ] = Parameter.new( v[ :type ], default: v[ :default ] )
    end
  end

  ports = {}
  if toplevel.has_key?( :port )
    toplevel[ :port ].values.each do | v |
      ports[ v[ :name ] ] = IfcPort.new( v[:name], v[:length]  )
    end
  end

  ifc_name = toplevel[:name].to_s + '_ifc'
  ifc_id   = ifc_name + ",v1"
  options[ 'interfaces'][ ifc_name ] = IfcDef.new( ifc_name, ifc_id, 0, ports )

  hdl_files.each do | f |
    f_opts = {}
    name = Pathname.new( f ).basename( ".*" ).to_s
    if name.include? "sim"
      f_opts[ 'use_syn'     => false ]
      f_opts[ 'use_mod_sim' => true  ]
    else
      f_opts[ 'use_syn'     => true  ]
      f_opts[ 'use_mod_sim' => false ]
    end
    options[ 'hdlfiles' ][ name ] = HDLFile.new( f, f_opts )
  end

  #
  # create new core
  #
  d = CoreDef.new( toplevel[ :name ], 
                   toplevel[ :name ]+",v1",
                   toplevel[ :name ], options)



  # dump the result
  return SOCMaker::to_yaml_s( d )

end