Class: HDLRuby::Low::Event

Inherits:
Base::Event
  • Object
show all
Includes:
Hparent, Low2Symbol
Defined in:
lib/HDLRuby/hruby_db.rb,
lib/HDLRuby/hruby_low.rb,
lib/HDLRuby/hruby_low2c.rb,
lib/HDLRuby/hruby_low2sym.rb,
lib/HDLRuby/hruby_low2vhd.rb,
lib/HDLRuby/hruby_low2high.rb,
lib/HDLRuby/hruby_low_mutable.rb,
lib/HDLRuby/hruby_low_skeleton.rb

Overview

Describes an event.

Direct Known Subclasses

High::Event

Constant Summary

Constants included from Low2Symbol

Low2Symbol::Low2SymbolPrefix, Low2Symbol::Low2SymbolTable, Low2Symbol::Symbol2LowTable

Instance Attribute Summary collapse

Attributes included from Hparent

#parent

Instance Method Summary collapse

Methods included from Low2Symbol

#to_sym

Methods included from Hparent

#scope

Constructor Details

#initialize(type, ref) ⇒ Event

Creates a new +type+ sort of event on signal refered by +ref+.



2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
# File 'lib/HDLRuby/hruby_low.rb', line 2198

def initialize(type,ref)
    # Check and set the type.
    @type = type.to_sym
    # Check and set the reference.
    unless ref.is_a?(Ref)
        raise AnyError, "Invalid class for a reference: #{ref.class}"
    end
    @ref = ref
    # And set the parent of ref.
    ref.parent = self
end

Instance Attribute Details

#refObject (readonly)

The reference of the event.



2195
2196
2197
# File 'lib/HDLRuby/hruby_low.rb', line 2195

def ref
  @ref
end

#typeObject (readonly)

The type of event.



2192
2193
2194
# File 'lib/HDLRuby/hruby_low.rb', line 2192

def type
  @type
end

Instance Method Details

#eql?(obj) ⇒ Boolean

Comparison for hash: structural comparison.

Returns:

  • (Boolean)


2211
2212
2213
2214
2215
2216
# File 'lib/HDLRuby/hruby_low.rb', line 2211

def eql?(obj)
    return false unless obj.is_a?(Event)
    return false unless @type.eql?(obj.type)
    return false unless @ref.eql?(obj.ref)
    return true
end

#hashObject

Hash function.



2219
2220
2221
# File 'lib/HDLRuby/hruby_low.rb', line 2219

def hash
    return [@type,@ref].hash
end

#on_edge?Boolean

Tells if there is a positive or negative edge event.

NOTE: checks if the event type is :posedge or :negedge

Returns:

  • (Boolean)


2226
2227
2228
# File 'lib/HDLRuby/hruby_low.rb', line 2226

def on_edge?
    return (@type == :posedge or @type == :negedge)
end

#reassign_expressions!(node2reassign) ⇒ Object

Replace node by corresponding replacement from +node2reassign+ that is a table whose entries are: +node+ the node to replace +rep+ the replacement of the node +ref+ the reference where to reassign the node.



444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 444

def reassign_expressions!(node2reassign)
    # Build the replacement table.
    node2rep = node2reassign.map {|n,r| [n,r[0]] }.to_h

    # Performs the replacement.
    node2rep_done = {} # The performed replacements.
    # Replace on the sons of the reference.
    node2rep_done.merge!(self.ref.replace_expressions!(node2rep))
    # Shall we replace the ref?
    rep = node2rep[self.ref]
    if rep then
        # Yes, do it.
        rep = rep.clone
        node = self.ref
        # node.set_parent!(nil)
        self.set_ref!(rep)
        node2rep_done[node] = rep
    end

    # Assign the replaced nodes.
    node2rep_done.each do |node,rep|
        reassign = node2reassign[node][1].clone
        self.parent.parent.
            add_connection(Connection.new(reassign,node.clone))
    end
end

#set_ref!(ref) ⇒ Object

Sets the reference to +ref+.



431
432
433
434
435
436
437
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 431

def set_ref!(ref)
    # Check and set the reference.
    unless ref.is_a?(Ref)
        raise AnyError, "Invalid class for a reference: #{ref.class}"
    end
    @ref = ref
end

#set_type!(type) ⇒ Object

Sets the type.



425
426
427
428
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 425

def set_type!(type)
    # Check and set the type.
    @type = type.to_sym
end

#to_c(level = 0) ⇒ Object

Generates the C text of the equivalent HDLRuby::High code. +level+ is the hierachical level of the object.



724
725
726
727
728
729
730
# File 'lib/HDLRuby/hruby_low2c.rb', line 724

def to_c(level = 0)
    edge = "ANYEDGE"
    edge = "POSEDGE" if self.type == :posedge
    edge = "NEGEDGE" if self.type == :negedge
    return "make_event(#{edge}," +
           "#{self.ref.resolve.to_c_signal(level+1)})"
end

#to_high(level = 0) ⇒ Object

Generates the text of the equivalent HDLRuby::High code. +level+ is the hierachical level of the object.



293
294
295
# File 'lib/HDLRuby/hruby_low2high.rb', line 293

def to_high(level = 0)
    return self.ref.to_high(level) + ".#{self.type}"
end