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_low2hdr.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
more...

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

#hierarchy, #scope

Constructor Details

#initialize(type, ref) ⇒ Event

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

[View source]

2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
# File 'lib/HDLRuby/hruby_low.rb', line 2350

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.


2347
2348
2349
# File 'lib/HDLRuby/hruby_low.rb', line 2347

def ref
  @ref
end

#typeObject (readonly)

The type of event.


2344
2345
2346
# File 'lib/HDLRuby/hruby_low.rb', line 2344

def type
  @type
end

Instance Method Details

#each_deep(&ruby_block) ⇒ Object

Iterates over each object deeply.

Returns an enumerator if no ruby block is given.

[View source]

2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
# File 'lib/HDLRuby/hruby_low.rb', line 2388

def each_deep(&ruby_block)
    # No ruby block? Return an enumerator.
    return to_enum(:each_deep) unless ruby_block
    # A ruby block? First apply it to current.
    ruby_block.call(self)
    # Then apply on the type.
    self.type.each_deep(&ruby_block)
    # Then apply on the reference.
    self.ref.each_deep(&ruby_block)
end

#eql?(obj) ⇒ Boolean

Comparison for hash: structural comparison.

Returns:

  • (Boolean)
[View source]

2366
2367
2368
2369
2370
2371
# File 'lib/HDLRuby/hruby_low.rb', line 2366

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.

[View source]

2374
2375
2376
# File 'lib/HDLRuby/hruby_low.rb', line 2374

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)
[View source]

2381
2382
2383
# File 'lib/HDLRuby/hruby_low.rb', line 2381

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.

[View source]

456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 456

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+.

[View source]

443
444
445
446
447
448
449
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 443

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.

[View source]

437
438
439
440
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 437

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

#to_c(res, level = 0) ⇒ Object

Generates the C text of the equivalent HDLRuby code. +level+ is the hierachical level of the object. def to_c(level = 0)

[View source]

809
810
811
812
813
814
815
816
817
818
819
# File 'lib/HDLRuby/hruby_low2c.rb', line 809

def to_c(res,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)})"
    res << "make_event(#{edge},"
    self.ref.resolve.to_c_signal(res,level+1)
    res << ")"
    return res
end

#to_hdr(level = 0) ⇒ Object

Generates the text of the equivalent hdr text. +level+ is the hierachical level of the object.

[View source]

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

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

#to_highObject

Creates a new high event.

[View source]

156
157
158
# File 'lib/HDLRuby/hruby_low2high.rb', line 156

def to_high
    return HDLRuby::High::Event.new(self.type.to_high,self.ref.to_high)
end