Class: RubyHDL::High::Type

Inherits:
Object
  • Object
show all
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

TypeDef, TypeGen, TypeStruct, TypeTuple, TypeVector

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from HDLRuby::Tprocess

#&, #*, #+, #+@, #-@, #/, #<<, #==, #abs, #lr, #make, #resolve, #slice, #~

Constructor Details

#initialize(name = nil) ⇒ Type

Creates a new type named +name+.



1133
1134
1135
1136
1137
1138
1139
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1133

def initialize(name = nil)
  if name then
    @name = name.to_sym 
    # Registers the name.
    self.register(name)
  end
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



1128
1129
1130
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1128

def name
  @name
end

Instance Method Details

#[](rng) ⇒ Object

Creates a new vector type of range +rng+ and with current type as base.



1342
1343
1344
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1342

def [](rng)
  return TypeVector.new(:"",self,rng)
end

#baseObject

Gets the base type, by default base type is not defined.



1229
1230
1231
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1229

def base
  raise "No base type for type #{self} (#{self.name})"
end

#base?Boolean

Tells if the type has a base.

Returns:

  • (Boolean)


1224
1225
1226
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1224

def base?
  return false
end

#binary(operator, expr0, expr1) ⇒ Object

Performs binary operation +operator+ on expressions +expr0+ and +expr1+.



1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1401

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



1382
1383
1384
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1382

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.



1375
1376
1377
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1375

def constant(hsh)
  RubyHDL::High.top_sblock.make_constants(self,hsh)
end

#define_operator(operator, &ruby_block) ⇒ Object

Redefinition of +operator+.



1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1414

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



1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1431

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

#directionObject

Get the direction of the type, little or big endian.



1208
1209
1210
1211
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1208

def direction
  # By default, little endian.
  return :little
end

#each_overload(&ruby_block) ⇒ Object

Interates over the overloaded operators.



1449
1450
1451
1452
1453
1454
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1449

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.



1263
1264
1265
1266
1267
1268
1269
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1263

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.

Returns:

  • (Boolean)


1144
1145
1146
1147
1148
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1144

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.

Returns:

  • (Boolean)


1257
1258
1259
1260
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1257

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.

Returns:

  • (Boolean)


1166
1167
1168
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1166

def fixed?
  return false
end

#float?Boolean

Tells if the type is floating point.

Returns:

  • (Boolean)


1171
1172
1173
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1171

def float?
  return false
end

#hashObject

Hash function.



1151
1152
1153
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1151

def hash
  return [@name].hash
end

#hierarchical?Boolean

Tells if the type is hierarchical.

Returns:

  • (Boolean)


1249
1250
1251
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1249

def hierarchical?
  return self.base? || self.types?
end

#htype?Boolean

Tells htype has been included.

Returns:

  • (Boolean)


1278
1279
1280
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1278

def htype?
  return true
end

#inner(*names) ⇒ Object

Declares high-level untyped inner signals named +names+ of the current type.



1369
1370
1371
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1369

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.



1349
1350
1351
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1349

def input(*names)
  RubyHDL::High.top_sblock.make_inputs(self,*names)
end

#leaf?Boolean

Tells if the type is a leaf.

Returns:

  • (Boolean)


1176
1177
1178
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1176

def leaf?
  return false
end

#leftObject

Gets the type as left value.

NOTE: used for asymetric types like TypeSystemI.



1315
1316
1317
1318
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1315

def left
  # By default self.
  self
end

#maxObject

Gets the type max value if any. Default: not defined.



1197
1198
1199
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1197

def max
  raise "No max value for type #{self} (#{self.name})"
end

#minObject

Gets the type min value if any. Default: not defined.



1203
1204
1205
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1203

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.



1355
1356
1357
1358
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1355

def output(*names)
  # High.top_user.make_outputs(self.instantiate,*names)
  RubyHDL::High.top_sblock.make_outputs(self,*names)
end

#rangeObject

Gets the range of the type, by default range is not defined.



1219
1220
1221
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1219

def range
  raise "No range for type #{self} (#{self.name})"
end

#range?Boolean

Tells if the type has a range.

Returns:

  • (Boolean)


1214
1215
1216
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1214

def range?
  return false
end

#register(name) ⇒ Object

Register the +name+ of the type.



1306
1307
1308
1309
1310
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1306

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

Returns:

  • (Boolean)


1239
1240
1241
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1239

def regular?
  return false
end

#rightObject

Gets the type as right value.

NOTE: used for asymetric types like TypeSystemI.



1323
1324
1325
1326
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1323

def right
  # By default self.
  self
end

#signed?Boolean

Tells if the type signed.

Returns:

  • (Boolean)


1156
1157
1158
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1156

def signed?
  return false
end

#struct?Boolean

Tells if the type has named sub types.

Returns:

  • (Boolean)


1244
1245
1246
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1244

def struct?
  return false
end

#to_cObject

Convert to C code.



1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1457

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_initObject

Convert to C initialization code.



1475
1476
1477
1478
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1475

def to_c_init
  # By default: 0
  return "0"
end

#to_python_initObject

Convert to Python initialization code.



1481
1482
1483
1484
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1481

def to_python_init
  # By default: 0
  return "0"
end

#to_tf_initObject

Convert to tensorflow initialization code.



1487
1488
1489
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1487

def to_tf_init
  return "tf.constant(0)"
end

#to_typeObject

Converts to a type. Returns self since it is already a type.



1284
1285
1286
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1284

def to_type
  return self
end

#to_vectorObject

Converts to a bit vector.



1273
1274
1275
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1273

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.



1331
1332
1333
1334
1335
1336
1337
1338
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1331

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.

Returns:

  • (Boolean)


1234
1235
1236
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1234

def types?
  return false
end

#unary(operator, expr) ⇒ Object

Performs unary operation +operator+ on expression +expr+.



1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1387

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.

Returns:

  • (Boolean)


1161
1162
1163
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1161

def unsigned?
  return false
end

#vector?Boolean

Tells if the type of of vector kind.

Returns:

  • (Boolean)


1181
1182
1183
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1181

def vector?
  return false
end

#widthObject

Gets the bitwidth of the type, by default 0. Bit, signed, unsigned and Float base have a width of 1.



1187
1188
1189
1190
1191
1192
1193
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1187

def width
  if [:bit, :signed, :unsigned, :float ].include?(@name) then
    return 1
  else
    return 0
  end
end