URL
https://opencores.org/ocsvn/soc_maker/soc_maker/trunk
Subversion Repositories soc_maker
[/] [soc_maker/] [trunk/] [lib/] [soc_maker.rb] - Rev 8
Go to most recent revision | Compare with Previous | Blame | View Log
################################################################# File: soc_maker.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 part of the SOCMaker module contains# - initialization of# - logger# - configuration# - library# (see SOCMaker::load)# - creating objects from YAML files/strings# (see from_f, from_s)# - creating YAML files from objects# (see SOCMaker::YAML_EXT::write_yaml)##################################################################require 'logger'require 'yaml'require 'digest/md5'require 'fileutils'# from# http://stackoverflow.com/questions/2281490/how-to-add-a-custom-log-level-to-logger-in-rubyclass Loggerdef self.custom_level(tag)SEV_LABEL << tagidx = SEV_LABEL.size - 1define_method(tag.downcase.gsub(/\W+/, '_').to_sym) do |progname, &block|add(idx, nil, progname, &block)endend# add processing log levelcustom_level 'PROC'endmodule SOCMakerclass << selfpublicattr_accessor :loggerattr_accessor :confattr_accessor :libdef load( options={} )options = { skip_refresh: false, logger_out: STDOUT }.merge( options )@conf = Conf::instance@logger = Logger.new(options[ :logger_out ] )@lib = Lib.new()@logger.progname = @conf[ :app_name ]@lib.refresh( options[ :libpath ] ) unless options[ :skip_refresh ]end## loading from from a YAML string#def from_s( s )objs = []SOCMaker::YPP.to_yaml( s ) do |yaml_obj_str|beginYAML::load( yaml_obj_str )o = YAML::load( yaml_obj_str )# ensure, that we load only our classesif SOCMaker::conf[ :yaml_classes ].include?( o.class )#o.verifyobjs << oelseSOCMaker::logger.warn( "Tried to load something, which does not belong to #{SOCMaker::conf[ :app_name ]}" )endrescue ArgumentError, Psych::SyntaxError => eSOCMaker::logger.error( 'YAML loading failed, invalid YAML syntax?' )SOCMaker::logger.error( ">>> #{e.to_s} <<<" )raise ERR::YAMLParseErrorelseendendif block_given?objs.each{ |o| yield(o) }endreturn ( objs.size >1 ? objs : objs[0] )end# Path argument can be an array of paths# or a file (wildcards are allowed)# loading from a YAML filedef from_f( path )path = Dir[ path ].sort if path.is_a?( String )SOCMaker::logger.warn( "No file(s) found to load" ) if path.size == 0yaml_str = ""path.each do |file|SOCMaker::logger.info "reading:" + fileyaml_str << File.read( file )endo = from_s( yaml_str )o.dir = File.dirname( path.first )return oendend## small module to extend classes,# which need to be written as yaml# outputmodule YAML_EXT# we remember always, were we've loaded a yaml fileattr_accessor :dirdef save_yaml( args )path = args.size==0 ? @spec_path : args.firstFile.open( path, 'w') {|f| f.write SOCMaker::YPP.from_yaml( YAML.dump( self ) ) }endend# :stopdoc:LIBPATH = ::File.expand_path('..', __FILE__) + ::File::SEPARATORPATH = ::File.dirname(LIBPATH) + ::File::SEPARATORVERSION = ::File.read(PATH + 'version.txt').strip# :startdoc:# Returns the library path for the module. If any arguments are given,# they will be joined to the end of the libray path using# <tt>File.join</tt>.#def self.libpath( *args )rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)if block_given?begin$LOAD_PATH.unshift LIBPATHrv = yieldensure$LOAD_PATH.shiftendendreturn rvend# Returns the lpath for the module. If any arguments are given,# they will be joined to the end of the path using# <tt>File.join</tt>.#def self.path( *args )rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)if block_given?begin$LOAD_PATH.unshift PATHrv = yieldensure$LOAD_PATH.shiftendendreturn rvenddef self.require_all_libsfile = ::File.basename(__FILE__, '.*')dir = ::File.dirname(__FILE__)%w[ err ypplib_inc componentcore_def core_insthdl_file ifc_defifc_port ifc_spcsoc_def parametersparameter hdl_coderlib cli conf].each { |rb| require ::File.expand_path(::File.join( dir, file, rb ) ) }endend # module SOCMakerSOCMaker.require_all_libs# vim: noai:ts=2:sw=2
Go to most recent revision | Compare with Previous | Blame | View Log
