Class: RubyHDL::High::Type
- Inherits:
-
Object
- Object
- RubyHDL::High::Type
- Includes:
- HDLRuby::Tprocess
- Defined in:
- lib/HDLRuby/std/sequencer_sw.rb
Overview
Describes a high-level data type.
NOTE: by default a type is not specified.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#name ⇒ Object
Returns the value of attribute name.
Instance Method Summary collapse
-
#[](rng) ⇒ Object
Creates a new vector type of range
rngand with current type as base. -
#base ⇒ Object
Gets the base type, by default base type is not defined.
-
#base? ⇒ Boolean
Tells if the type has a base.
-
#binary(operator, expr0, expr1) ⇒ Object
Performs binary operation
operatoron expressionsexpr0andexpr1. -
#comp_operator(op) ⇒ Object
Gets the computation method for
operator. -
#constant(hsh) ⇒ Object
Declares high-level untyped constant signals by name and value given by
hshof the current type. -
#define_operator(operator, &ruby_block) ⇒ Object
Redefinition of
operator. -
#define_operator_with_context(operator, &ruby_block) ⇒ Object
Redefinition of
operatorwhen requiring the context to be passed as argument (normally only used internally). -
#direction ⇒ Object
Get the direction of the type, little or big endian.
-
#each_overload(&ruby_block) ⇒ Object
Interates over the overloaded operators.
-
#each_type_deep(&ruby_block) ⇒ Object
(also: #each_deep)
Iterates over the types deeply if any.
-
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
-
#equivalent?(type) ⇒ Boolean
Tell if
typeis equivalent to current type. -
#fixed? ⇒ Boolean
Tells if the type is fixed point.
-
#float? ⇒ Boolean
Tells if the type is floating point.
-
#hash ⇒ Object
Hash function.
-
#hierarchical? ⇒ Boolean
Tells if the type is hierarchical.
-
#htype? ⇒ Boolean
Tells htype has been included.
-
#initialize(name = nil) ⇒ Type
constructor
Creates a new type named
name. -
#inner(*names) ⇒ Object
Declares high-level untyped inner signals named
namesof the current type. -
#input(*names) ⇒ Object
Declares high-level input signals named
namesof the current type. -
#leaf? ⇒ Boolean
Tells if the type is a leaf.
-
#left ⇒ Object
Gets the type as left value.
-
#max ⇒ Object
Gets the type max value if any.
-
#min ⇒ Object
Gets the type min value if any.
-
#output(*names) ⇒ Object
Declares high-level untyped output signals named
namesof the current type. -
#range ⇒ Object
Gets the range of the type, by default range is not defined.
-
#range? ⇒ Boolean
Tells if the type has a range.
-
#register(name) ⇒ Object
Register the
nameof the type. -
#regular? ⇒ Boolean
Tells if the type is regular (applies for tuples).
-
#right ⇒ Object
Gets the type as right value.
-
#signed? ⇒ Boolean
Tells if the type signed.
-
#struct? ⇒ Boolean
Tells if the type has named sub types.
-
#to_c ⇒ Object
Convert to C code.
-
#to_c_init ⇒ Object
Convert to C initialization code.
-
#to_type ⇒ Object
Converts to a type.
-
#to_vector ⇒ Object
Converts to a bit vector.
-
#typedef(name) ⇒ Object
Declares a new type definition with
nameequivalent to current one. -
#types? ⇒ Boolean
Tells if the type has sub types.
-
#unary(operator, expr) ⇒ Object
Performs unary operation
operatoron expressionexpr. -
#unsigned? ⇒ Boolean
Tells if the type is unsigned.
-
#vector? ⇒ Boolean
Tells if the type of of vector kind.
-
#width ⇒ Object
Gets the bitwidth of the type, by default 0.
Methods included from HDLRuby::Tprocess
#&, #*, #+, #+@, #-@, #/, #<<, #==, #abs, #lr, #make, #resolve, #slice, #~
Constructor Details
#initialize(name = nil) ⇒ Type
Creates a new type named name.
715 716 717 718 719 720 721 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 715 def initialize(name = nil) if name then @name = name.to_sym # Registers the name. self.register(name) end end |
Instance Attribute Details
#name ⇒ Object
Returns the value of attribute name.
710 711 712 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 710 def name @name end |
Instance Method Details
#[](rng) ⇒ Object
Creates a new vector type of range rng and with current type as
base.
924 925 926 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 924 def [](rng) return TypeVector.new(:"",self,rng) end |
#base ⇒ Object
Gets the base type, by default base type is not defined.
811 812 813 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 811 def base raise "No base type for type #{self} (#{self.name})" end |
#base? ⇒ Boolean
Tells if the type has a base.
806 807 808 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 806 def base? return false end |
#binary(operator, expr0, expr1) ⇒ Object
Performs binary operation operator on expressions expr0
and expr1.
983 984 985 986 987 988 989 990 991 992 993 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 983 def binary(operator, expr0, expr1) # Look for a specific computation method. comp = comp_operator(operator) if self.respond_to?(comp) then # Found, use it. self.send(comp,expr0,expr1) else # Not found, back to default computation. expr0.to_value.send(operator,expr1) end end |
#comp_operator(op) ⇒ Object
Gets the computation method for operator.
964 965 966 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 964 def comp_operator(op) return (op.to_s + ":C").to_sym end |
#constant(hsh) ⇒ Object
Declares high-level untyped constant signals by name and
value given by hsh of the current type.
957 958 959 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 957 def constant(hsh) RubyHDL::High.top_sblock.make_constants(self,hsh) end |
#define_operator(operator, &ruby_block) ⇒ Object
Redefinition of operator.
996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 996 def define_operator(operator,&ruby_block) # Ensure there is a block. ruby_block = proc {} unless block_given? # Register the operator as overloaded. @overloads ||= {} @overloads[operator] = ruby_block # Set the new method for the operator. self.define_singleton_method(comp_operator(operator)) do |*args| # puts "Top user=#{HDLRuby::High.top_user}" RubyHDL::High.top_sblock.sub(RubyHDL.uniq_name) do ruby_block.call(*args) end end end |
#define_operator_with_context(operator, &ruby_block) ⇒ Object
Redefinition of operator when requiring the context to be passed
as argument (normally only used internally).
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1013 def define_operator_with_context(operator,&ruby_block) # Ensure there is a block. ruby_block = proc {} unless block_given? # Register the operator as overloaded. @overloads ||= {} @overloads[operator] = ruby_block # Set the new method for the operator. self.define_singleton_method(comp_operator(operator)) do |*args| # puts "Top user=#{HDLRuby::High.top_user}" RubyHDL::High.top_sblock.sub(RubyHDL.uniq_name) do # It is assumed that the first argument of the ruby_block # is the context in which it must be executed. ruby_block.call(self,*args) end end end |
#direction ⇒ Object
Get the direction of the type, little or big endian.
790 791 792 793 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 790 def direction # By default, little endian. return :little end |
#each_overload(&ruby_block) ⇒ Object
Interates over the overloaded operators.
1031 1032 1033 1034 1035 1036 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1031 def each_overload(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_overload) unless ruby_block # A block? Apply it on each overload if any. @overloads.each(&ruby_block) if @overloads end |
#each_type_deep(&ruby_block) ⇒ Object Also known as: each_deep
Iterates over the types deeply if any.
845 846 847 848 849 850 851 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 845 def each_type_deep(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_type_deep) unless ruby_block # A ruby block? First apply it to current. ruby_block.call(self) # And that's all by default. end |
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
726 727 728 729 730 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 726 def eql?(obj) return false unless obj.is_a?(Type) return false unless @name.eql?(obj.name) return true end |
#equivalent?(type) ⇒ Boolean
Tell if type is equivalent to current type.
NOTE: type can be compatible while not being equivalent, please
refer to hruby_types.rb for type compatibility.
839 840 841 842 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 839 def equivalent?(type) # By default, types are equivalent iff they have the same name. return (type.is_a?(Type) and self.name == type.name) end |
#fixed? ⇒ Boolean
Tells if the type is fixed point.
748 749 750 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 748 def fixed? return false end |
#float? ⇒ Boolean
Tells if the type is floating point.
753 754 755 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 753 def float? return false end |
#hash ⇒ Object
Hash function.
733 734 735 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 733 def hash return [@name].hash end |
#hierarchical? ⇒ Boolean
Tells if the type is hierarchical.
831 832 833 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 831 def hierarchical? return self.base? || self.types? end |
#htype? ⇒ Boolean
Tells htype has been included.
860 861 862 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 860 def htype? return true end |
#inner(*names) ⇒ Object
Declares high-level untyped inner signals named names of the
current type.
951 952 953 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 951 def inner(*names) RubyHDL::High.top_sblock.make_inners(self,*names) end |
#input(*names) ⇒ Object
Declares high-level input signals named names of the current type.
931 932 933 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 931 def input(*names) RubyHDL::High.top_sblock.make_inputs(self,*names) end |
#leaf? ⇒ Boolean
Tells if the type is a leaf.
758 759 760 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 758 def leaf? return false end |
#left ⇒ Object
Gets the type as left value.
NOTE: used for asymetric types like TypeSystemI.
897 898 899 900 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 897 def left # By default self. self end |
#max ⇒ Object
Gets the type max value if any. Default: not defined.
779 780 781 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 779 def max raise "No max value for type #{self} (#{self.name})" end |
#min ⇒ Object
Gets the type min value if any. Default: not defined.
785 786 787 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 785 def min raise "No min value for type #{self} (#{self.name})" end |
#output(*names) ⇒ Object
Declares high-level untyped output signals named names of the
current type.
937 938 939 940 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 937 def output(*names) # High.top_user.make_outputs(self.instantiate,*names) RubyHDL::High.top_sblock.make_outputs(self,*names) end |
#range ⇒ Object
Gets the range of the type, by default range is not defined.
801 802 803 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 801 def range raise "No range for type #{self} (#{self.name})" end |
#range? ⇒ Boolean
Tells if the type has a range.
796 797 798 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 796 def range? return false end |
#register(name) ⇒ Object
Register the name of the type.
888 889 890 891 892 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 888 def register(name) # Sets the hdl-like access to the type. obj = self # For using the right self within the proc RubyHDL::High.top_sblock.register(name) { obj } end |
#regular? ⇒ Boolean
Tells if the type is regular (applies for tuples).
821 822 823 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 821 def regular? return false end |
#right ⇒ Object
Gets the type as right value.
NOTE: used for asymetric types like TypeSystemI.
905 906 907 908 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 905 def right # By default self. self end |
#signed? ⇒ Boolean
Tells if the type signed.
738 739 740 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 738 def signed? return false end |
#struct? ⇒ Boolean
Tells if the type has named sub types.
826 827 828 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 826 def struct? return false end |
#to_c ⇒ Object
Convert to C code.
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1039 def to_c case @name when :void return "void" when :bit, :unsigned return "unsigned" when :signed return "signed" when :float return "double" when :string return "char*" else return @name.to_s end end |
#to_c_init ⇒ Object
Convert to C initialization code.
1057 1058 1059 1060 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1057 def to_c_init # By default: 0 return "0" end |
#to_type ⇒ Object
Converts to a type. Returns self since it is already a type.
866 867 868 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 866 def to_type return self end |
#to_vector ⇒ Object
Converts to a bit vector.
855 856 857 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 855 def to_vector return TypeVector.new(:"", Bit, self.width-1..0) end |
#typedef(name) ⇒ Object
Declares a new type definition with name equivalent to current one.
913 914 915 916 917 918 919 920 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 913 def typedef(name) # Create the new type. typ = TypeDef.new(name,self) # Register it. High.top_sblock.register(name) { typ } # Return it. return typ end |
#types? ⇒ Boolean
Tells if the type has sub types.
816 817 818 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 816 def types? return false end |
#unary(operator, expr) ⇒ Object
Performs unary operation operator on expression expr.
969 970 971 972 973 974 975 976 977 978 979 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 969 def unary(operator,expr) # Look for a specific computation method. comp = comp_operator(operator) if self.respond_to?(comp) then # Found, use it. self.send(comp,expr) else # Not found, back to default computation. expr.to_value.send(operator) end end |
#unsigned? ⇒ Boolean
Tells if the type is unsigned.
743 744 745 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 743 def unsigned? return false end |
#vector? ⇒ Boolean
Tells if the type of of vector kind.
763 764 765 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 763 def vector? return false end |
#width ⇒ Object
Gets the bitwidth of the type, by default 0. Bit, signed, unsigned and Float base have a width of 1.
769 770 771 772 773 774 775 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 769 def width if [:bit, :signed, :unsigned, :float ].include?(@name) then return 1 else return 0 end end |