URL
https://opencores.org/ocsvn/soc_maker/soc_maker/trunk
Subversion Repositories soc_maker
[/] [soc_maker/] [trunk/] [lib/] [soc_maker/] [core_def.rb] - Rev 5
Go to most recent revision | Compare with Previous | Blame | View Log
################################################################# File: core_def.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 definition.# It is one of the central classes and holds data,# which is used to describe and instanciate this core.# In general, instances of this class desribe a core,# it's interface and parameters as well as the files,# which are required for synthesis/simulation.## In addition to this core, there exist CoreInst,# which represents a concret instanciation of a definition# (see core_inst.rb).# This class adds two fields to SOCMaker::Component:# - hdlfiles : hash of SOCMaker::HDLFile (mandatory,# at least one file)########## TODO#################################################################module SOCMakerclass CoreDef < Componentinclude ERRinclude YAML_EXTattr_accessor :hdlfilesdef initialize( name, version, hdl_files, toplevel, options = {} )init_with( { 'name' => name,'version' => version,'hdlfiles' => hdl_files,'toplevel' => toplevel }.merge( options ) )enddef encode_with( coder )super codercoder[ 'hdlfiles' ] = @hdlfilesenddef init_with( coder )super( coder )serr_if( coder[ 'hdlfiles' ] == nil,'No hdlfiles field found',instance: @name,fiel: 'hdlfiles' )@hdlfiles = coder[ 'hdlfiles' ]serr_if( !@hdlfiles.is_a?( Hash ),'HDL file def. != Hash',instance: @name,field: 'hdlfiles' )serr_if( @hdlfiles.size == 0,'No HDL files are given',instance: @name,field: 'hdlfiles' )@hdlfiles.each do |file_name, defn |serr_if( defn == nil,'HDL file not defined',instance: @name+":"+file_name.to_s )serr_if( !defn.is_a?( SOCMaker::HDLFile ),'HDL file not SOCMaker::HDLFile (use SOCM_HDL_FILE)',instance: @name+":"+file_name.to_s )endend# def get_files# unless self.vccmd.nil? or self.vccmd.size == 0# system( self.vccmd )# end# enddef generics@inst_parameters.each_with_index do |(name, val), i|yield( name.to_s, val.type, val.default, i == @inst_parameters.size-1 )endend## Iterates over interface list.# For each interface, all ports are processed.# For each port within each interface, we lookup the port defn# and yield the call block with# - port-name# - port-definition# - info if last# as argument###def ports( *args )if args.size == 0@interfaces.values.each_with_index do | ifc, i_ifc; ifc_def|# get interface definitionifc_def = SOCMaker::lib.get_ifc( ifc.name, ifc.version )# loop over ports in this interfaceifc.ports.each_with_index do |(port_name, port_def), i_port; port_dir|# the reference to the port in the definitiondefn_ref = port_def.defnport_dir = ifc_def.ports[ defn_ref.to_sym ]perr_if( port_dir == nil,"Can't find #{defn_ref} in interface " +"definition #{ifc_def.name} version " +ifc_def.version + "==>>" + ifc_def.to_yaml )# An xor mechanism between port_dir and ifc=>dir is used# to determine the direction of a port, for example:# If the interface is declared as input (1) and a port is declared as input (1)# the resulting direction will be an output 1^1 = 0.# But if the overall interface direction is an output (0) and a port is declared# as input, the resulting direction will an input 0^1 = 1.# This allows to define a port-direction in the interface definition,# and toggle the directions on core-definition level.# (name, direction, length, is_last)yield( port_name.to_s,port_dir ^ ifc.dir,port_def.len,( (i_port == ifc.ports.size-1 ) and (i_ifc == @interfaces.size-1 ) ) )endend# elsif args.size == 1# # get interface (input is the name as string )# ifc = @interfaces[ args.first.to_sym ]# ifc_def = SOCMaker::lib.get_ifc( ifc.name, ifc.version )# ifc.ports.each do |port_name, port_def; port_dir|# port_def = port_def.defn# port_dir = ifc_def.ports[ port_def.to_sym ]# if port_dir == nil# perr_if( port_dir==nil,# "Can't find #{port_def} in" +# "interface definition #{ifc_def.name} " +# "version #{ifc_def.version}" )# end# yield( port_def.to_s,# port_name.to_s,# port_dir ^ ifc.dir )# endelseendenddef param_ok?( param_name, param_value )param = inst_parameters[ param_name.to_sym ]param = static_parameters[ param_name.to_sym ] if param == nilreturn false if param == nilenddef verify( is_soc = false )# check hdl-files@hdlfiles.each do |file_name, defn |defn.verifyendenddef ==(o)o.class == self.class &&o.hdlfiles == self.hdlfiles &&super( o )endend # class CoreDefend # module SOCMaker# vim: noai:ts=2:sw=2
Go to most recent revision | Compare with Previous | Blame | View Log
