class ClassHDL::GenerateBlock

Attributes

block_index[RW]

Public Class Methods

new(belong_to_module) click to toggle source
Calls superclass method
# File lib/tdl/class_hdl/hdl_generate.rb, line 20
def initialize(belong_to_module)
    @belong_to_module = belong_to_module
    super("genblk#{globle_random_name_flag()}")
    unless @belong_to_module
        raise TdlError.new("GenerateBlock must have belong_to_module")
    end
end

Public Instance Methods

ELSE(&block) click to toggle source
Calls superclass method
# File lib/tdl/class_hdl/hdl_generate.rb, line 95
def ELSE(&block)
    if ClassHDL::AssignDefOpertor.curr_assign_block.is_a? HDLAssignGenerateBlock
        head_str = "else begin\n"
        # yield
        tmp_sm = ClearGenerateSlaverBlock.new(self)
        tmp_sm.module_name = "generate_sub_block_#{self.block_index}"
        inst_obj = tmp_sm.instanced("genblk#{self.block_index}",tmp_sm)
        inst_obj.belong_to_module = tmp_sm
        add_children_modules(inst_obj:inst_obj ,module_poit: tmp_sm)

        tmp_sm.instance_exec(&block)
        ClassHDL::AssignDefOpertor.with_rollback_opertors(:old) do 
            body_str = tmp_sm.instance_draw + tmp_sm.vars_exec_inst
            gbody_str = body_str.gsub(/^./){ |m| "    #{m}"}
            self.Logic_inst.push(head_str+gbody_str+"end\n")
        end
    else 
        super(&block)
    end
end
ELSIF(cond,&block) click to toggle source
Calls superclass method
# File lib/tdl/class_hdl/hdl_generate.rb, line 70
def ELSIF(cond,&block)
    if ClassHDL::AssignDefOpertor.curr_assign_block.is_a? HDLAssignGenerateBlock
        if cond.respond_to?(:instance)
            head_str = "else if(#{cond.instance(:cond,@belong_to_module)})begin\n"
        else 
            head_str = "else if(#{cond})begin\n"
        end
        # yield
        tmp_sm = ClearGenerateSlaverBlock.new(self)
        tmp_sm.module_name = "generate_sub_block_#{self.block_index}"
        inst_obj = tmp_sm.instanced("genblk#{self.block_index}",tmp_sm)
        inst_obj.belong_to_module = tmp_sm
        add_children_modules(inst_obj:inst_obj ,module_poit: tmp_sm)

        tmp_sm.instance_exec(&block)
        ClassHDL::AssignDefOpertor.with_rollback_opertors(:old) do 
            body_str = tmp_sm.instance_draw + tmp_sm.vars_exec_inst
            gbody_str = body_str.gsub(/^./){ |m| "    #{m}"}
            self.Logic_inst.push(head_str+gbody_str+"end\n")
        end
    else 
        super(cond,&block)
    end
end
IF(cond,&block) click to toggle source
Calls superclass method
# File lib/tdl/class_hdl/hdl_generate.rb, line 44
def IF(cond,&block)
    if ClassHDL::AssignDefOpertor.curr_assign_block.is_a? HDLAssignGenerateBlock
        if cond.respond_to?(:instance)
            head_str = "\nif(#{cond.instance(:cond, @belong_to_module)})begin\n"
        else 
            head_str = "\nif(#{cond})begin\n"
        end
        # yield
        tmp_sm = ClearGenerateSlaverBlock.new(self)

        tmp_sm.module_name = "generate_sub_block_#{self.block_index}"
        inst_obj = tmp_sm.instanced("genblk#{self.block_index}",tmp_sm)
        inst_obj.belong_to_module = tmp_sm
        add_children_modules(inst_obj:inst_obj ,module_poit: tmp_sm)

        tmp_sm.instance_exec(&block)
        ClassHDL::AssignDefOpertor.with_rollback_opertors(:old) do 
            body_str = tmp_sm.instance_draw + tmp_sm.vars_exec_inst
            gbody_str = body_str.gsub(/^./){ |m| "    #{m}"}
            self.Logic_inst.push(head_str+gbody_str+"end ")
        end
    else 
        super(cond,&block)
    end
end
method_missing(name,*args,&block) click to toggle source
# File lib/tdl/class_hdl/hdl_generate.rb, line 29
def method_missing(name,*args,&block)
    ClassHDL::AssignDefOpertor.with_rollback_opertors(:old) do
        ## 优先判断 belong_to_module 有没有定义此方法
        if root_sdlmodule.respond_to? name 
            root_sdlmodule.send(name,*args,&block)
        elsif SdlModule.exist_module?(name)
        # puts root_sdlmodule
        # if SdlModule.exist_module?(name)
            ClassHDL::ImplicitInstModule.new(name,self)
        else
            @belong_to_module.send(name,*args,&block)
        end
    end
end