OpenCores
URL https://opencores.org/ocsvn/soc_maker/soc_maker/trunk

Subversion Repositories soc_maker

[/] [soc_maker/] [trunk/] [lib/] [soc_maker/] [core_inst.rb] - Rev 4

Go to most recent revision | Compare with Previous | Blame | View Log

###############################################################
#   
#  File:      core_inst.rb
#
#  Author:    Christian Hättich
#
#  Project:   System-On-Chip Maker
#
#  Target:    Linux / Windows / Mac
#
#  Language:  ruby
#
#
###############################################################
#
#
#   Copyright (C) 2014  Christian Hättich  - feddischson [ at ] opencores.org
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
###############################################################
#
#   Description:
#     This class represents a core instantiation within
#     a SOC. It contains a params (parameters) hash,
#     which defines, which parameters are set to which values.
#     The type field is used to identify the SOCMaker::CoreDef
#     and the field @defn is initialized as reference to 
#     the corresponding CoreDef instance.
#
#
###############################################################


module SOCMaker
class CoreInst
  include ERR
 


  attr_accessor :defn
  attr_accessor :type
  attr_accessor :params 

  def initialize(  type, params = {} )
    init_with(  'type'   => type,
                'params' => params  )
    verify
  end
  def encode_with( coder )
    %w[ type params ].
      each { |v| coder[ v ] = instance_variable_get "@#{v}" }
  end

  def init_with( coder )

    serr_if( coder[ 'type' ] == nil,
      "no type is provided for a core instance",
      field: "type" )

    @type = coder[ 'type' ]

    @params = coder[ 'params' ] || {} 
    serr_if( !@params.is_a?( Hash ), 'Parameters are not given as hash',
      field: 'params' )

  end

  #
  # TODO: extract the HDL ports
  #
  # HDLParam = Struct.new( :value, :type )
  # HDLPort  = Struct.new( :len, :dir )
  def ports
    @ports.each_with_index do |(name, port_def), i|
      yield( name.to_s, port_def[ :len ], port_def[ :dir ], i==@ports.size-1 )
    end
  end


  def generics
    @defn.generics do |name, type, default_value, is_last|
      value = @params[ name.to_sym ];
      value = value
      value = default_value if value == nil
      yield( name.to_s, type, value, is_last )
    end
  end


  def get_len( ifc_name, port_spec_name )


    # get the port name, which we are using
    tmp = @defn.interfaces[ ifc_name.to_sym ].
        ports.select{ |key,hash| hash.defn == port_spec_name.to_s }.
        keys.first.to_s
    return @ports[ tmp.to_sym ][ :len ]
  end

  def get_port( ifc_name, port_spec_name )
    tmp = @defn.interfaces[ ifc_name.to_sym ].
        ports.select{ |key,hash| hash.defn == port_spec_name.to_s }.
        keys.first.to_s
    return [ tmp, @ports[ tmp.to_sym ] ]
  end



  def verify

    @defn = SOCMaker::lib.get_core( @type )
    
    
    # check, if the instance parameters in the core definition
    @params.each do |param_name, value|
      verr_if(  @defn.inst_parameters[ param_name ] == nil, 
                "Parameter not found: " + param_name.to_s, 
        field: 'params' )
    end

    ## auto-complete parameters with default values
    @defn.inst_parameters.each do |param_name, param|
    
      # auto-complete to default values
      @params[ param_name ] ||= param.default
    end









#   @_params ||= {}
#   if @params != nil 
#     @params.each do |name, val|
#   
#       param_type = defn.inst_parameters[ name ].type
#   
#       if val.is_a? String
#         eval_match = SOCMaker::conf[ :eval_regex ].match( val )
#         #TODO error handling
#         if eval_match
#           #eval_func = eval_match.captures[0]
#           @_params[ name ] = { value: eval( eval_str ).to_s, type: param_type }
#         else
#           @_params[ name ] = { value: val, type: param_type }
#         end
#       else
#         @_params[ name ] = { value: val, type: param_type }
#       end
#     end 
#   end
    
    @ports ||= {}
    @defn.ports do |port_name, port_dir, port_len, is_last |
      if port_len.is_a?( String )
        param_match = SOCMaker::conf[ :length_regex ].match( port_len ) 
        
        if param_match and @params[ port_len.to_sym ] != nil
          tmp =@params[ port_len.to_sym ]
          tmp = tmp.to_i if tmp.is_a?( String )
          @ports[ port_name.to_sym ] = { len: tmp, dir: port_dir }
        else
          SOCMaker::logger.error( "Failed to evaluate #{port_len} for port #{port_name}" )
        end
      else
        @ports[ port_name.to_sym ] = { len: port_len, dir: port_dir }
      end
    end
    
    lerr_if( @defn == nil, 'Core not found in lib',                
      field:    'cores'    )
 
  end    




  def ==(o)
    o.class     == self.class   && 
    o.type      == self.type    &&
    o.params    == self.params
  end


end # CoreInst
end # SOCMaker



# vim: noai:ts=2:sw=2

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.