HDLRuby 3.5.1 → 3.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/lib/HDLRuby/hdr_samples/with_board.rb +10 -1
- data/lib/HDLRuby/ui/hruby_board.rb +117 -6
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/tutorial_sw.html +4 -0
- data/tuto/tutorial_sw.md +4 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 705f4b6e4835c910f62b0bced03175761ce62766d976c71123fa8756d7103714
|
4
|
+
data.tar.gz: e72f192e90d3aad1fa9819988251223108011b3bd9e931d3349ed1dd6d7413f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d92f346ae79abb3a701784861d16c162a134a2f07477657e6976d569d591cbbb38f0bff20da5b2eeff6b32efdc170b539e34f807bba1d58ac770611b1582810f
|
7
|
+
data.tar.gz: d84037e56a7dacfc3e43a96a8885f1813b2a708be069a128878e3cf8a54602d3a28dd0db7d04fdde976bdde6880afd7b239bd356addd37bc0bcd05abab7a45ee
|
data/README.md
CHANGED
@@ -17,6 +17,10 @@ hdrcc --get-tuto
|
|
17
17
|
|
18
18
|
__What's new__
|
19
19
|
|
20
|
+
For HDLRuby version 3.6.0:
|
21
|
+
|
22
|
+
* Added a new element for the GUI board that allows to assign an expression to a signal on the fly while simulating.
|
23
|
+
|
20
24
|
For HDLRuby version 3.5.0:
|
21
25
|
|
22
26
|
* Added direct support for Verilog HDL files as input to 'hdrcc'.
|
@@ -2220,6 +2224,10 @@ The list of possible elements is as follows:
|
|
2220
2224
|
|
2221
2225
|
* `bt`: represents a set of push buttons, their number is set to match the bit-width of the attached signal.
|
2222
2226
|
|
2227
|
+
* `text`: Represents a text input box whose content is interpreted as an expression. The syntax of the expression follows Ruby, and the available variables include the board's display objects. For example, if a set of LEDs is named `leds`, it will be accessible as a variable.
|
2228
|
+
|
2229
|
+
* `hook`: Attaches a signal to the board without displaying. It can be used as a variable in `text` expressions, similar to display objects.
|
2230
|
+
|
2223
2231
|
* `led`: represents a set of LEDs, their number is set to match the bit-width of the attached signal.
|
2224
2232
|
|
2225
2233
|
* `hexa`: represents a hexadecimal number display, its character width is set to match the width of the largest possible value of the attached signal.
|
@@ -10,6 +10,7 @@ system :with_board do
|
|
10
10
|
inner rst: 0
|
11
11
|
[8].inner :sw_a, :sw_b
|
12
12
|
[9].inner :led_z
|
13
|
+
[8].inner :expr, :show
|
13
14
|
[16].inner counter: 0
|
14
15
|
[8].inner :counter8
|
15
16
|
signed[8].inner :scounter8
|
@@ -19,11 +20,16 @@ system :with_board do
|
|
19
20
|
board(:some_board) do
|
20
21
|
actport clk2.posedge
|
21
22
|
bt reset: rst
|
23
|
+
hook sw_ai: sw_a
|
24
|
+
hook sw_bi: sw_b
|
22
25
|
row
|
23
26
|
sw sw_a: sw_a
|
24
27
|
sw sw_b: sw_b
|
25
28
|
led led_z: led_z
|
26
29
|
row
|
30
|
+
text expr: expr
|
31
|
+
digit show: show
|
32
|
+
row
|
27
33
|
digit cnt_d: counter
|
28
34
|
hexa cnt_h: counter
|
29
35
|
digit cnt_s: scounter8
|
@@ -35,6 +41,9 @@ system :with_board do
|
|
35
41
|
# The adder.
|
36
42
|
led_z <= sw_a.as(bit[9]) + sw_b
|
37
43
|
|
44
|
+
# The text input and result.
|
45
|
+
show <= expr
|
46
|
+
|
38
47
|
# The counters and the generation of +clk2+.
|
39
48
|
counter8 <= counter[7..0]
|
40
49
|
scounter8 <= counter[7..0]
|
@@ -52,7 +61,7 @@ system :with_board do
|
|
52
61
|
clk <= 0
|
53
62
|
clk2 <= 0
|
54
63
|
!10.ns
|
55
|
-
repeat(
|
64
|
+
repeat(10000) do
|
56
65
|
clk <= 1
|
57
66
|
!10.ns
|
58
67
|
clk <= 0
|
@@ -20,6 +20,9 @@ module HDLRuby::High::Std
|
|
20
20
|
include Hmissing
|
21
21
|
|
22
22
|
attr_reader :namespace
|
23
|
+
|
24
|
+
## Suffix telling a text is an expression to compute.
|
25
|
+
TO_COMPUTE = "="
|
23
26
|
|
24
27
|
## Class describing a row of slide switches.
|
25
28
|
SW = Struct.new(:id, :size, :hwrite) do
|
@@ -50,6 +53,27 @@ module HDLRuby::High::Std
|
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
56
|
+
## Class describing a text-based input.
|
57
|
+
TEXT = Struct.new(:id, :size, :hwrite) do
|
58
|
+
def to_html
|
59
|
+
return "<div class=\"textset\" id=\"#{self.id}\" data-value=\"0\">\\n" +
|
60
|
+
'<form onSubmit="text_submit(this); return false">\\n' +
|
61
|
+
'<span class="name">' + self.hwrite.to_s.chop + '</span>' +
|
62
|
+
'<span> </span>' +
|
63
|
+
'<input class="matrix_in" type="text" name="text" ' +
|
64
|
+
'placeholder="Enter an expression">' +
|
65
|
+
"</form>\\n" +
|
66
|
+
"</div>\\n"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
## Class describing a hook (invisible display element).
|
71
|
+
HOOK = Struct.new(:id, :size, :hread) do
|
72
|
+
def to_html
|
73
|
+
return "<div id=\"#{self.id}\" data-value=\"0\"/>\\n"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
53
77
|
## Class describing a row of LEDs.
|
54
78
|
LED = Struct.new(:id, :size, :hread) do
|
55
79
|
def to_html
|
@@ -476,6 +500,17 @@ Content-Type: text/html
|
|
476
500
|
-webkit-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
|
477
501
|
}
|
478
502
|
|
503
|
+
.matrix_in {
|
504
|
+
font-size: 26px;
|
505
|
+
font-family: "Lucida Console", "Courier New", monospace;
|
506
|
+
color: #0B190B;
|
507
|
+
background-color: #9BBC0F;
|
508
|
+
border: solid 2px #505050;
|
509
|
+
box-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
|
510
|
+
-moz-box-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
|
511
|
+
-webkit-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
|
512
|
+
}
|
513
|
+
|
479
514
|
.bt {
|
480
515
|
background-color: #ccc;
|
481
516
|
border: solid 2px #505050;
|
@@ -586,7 +621,8 @@ Content-Type: text/html
|
|
586
621
|
const element = prow.lastElementChild;
|
587
622
|
// Depending of the kind of element.
|
588
623
|
if (element.classList.contains('swset') ||
|
589
|
-
|
624
|
+
element.classList.contains('btset') ||
|
625
|
+
element.classList.contains('textset') ) {
|
590
626
|
// Input element.
|
591
627
|
input_ids.push(element.id);
|
592
628
|
} else {
|
@@ -660,6 +696,16 @@ Content-Type: text/html
|
|
660
696
|
btset.dataset.value = btset.dataset.value & ~(1 << bit);
|
661
697
|
}
|
662
698
|
|
699
|
+
|
700
|
+
// Handler of the text submit
|
701
|
+
function text_submit(form) {
|
702
|
+
// Get the et holding the form.
|
703
|
+
const textset = form.parentElement;
|
704
|
+
// Update the value, suffixed with #{TO_COMPUTE} for telling it is a
|
705
|
+
// text expression to compute.
|
706
|
+
textset.dataset.value = form.elements.text.value + "#{TO_COMPUTE}"
|
707
|
+
}
|
708
|
+
|
663
709
|
|
664
710
|
// Switch a led on.
|
665
711
|
function led_on(led) {
|
@@ -916,7 +962,7 @@ HTMLRESPONSE
|
|
916
962
|
end
|
917
963
|
# Create the HDLRuby program port.
|
918
964
|
@program.outport(hport)
|
919
|
-
# Create the
|
965
|
+
# Create the UI component.
|
920
966
|
hport = hport.first
|
921
967
|
@elements << SW.new(@elements.size,hport[1].type.width,:"#{hport[0]}=")
|
922
968
|
end
|
@@ -929,10 +975,37 @@ HTMLRESPONSE
|
|
929
975
|
# Create the HDLRuby program port.
|
930
976
|
@program.outport(hport)
|
931
977
|
hport = hport.first
|
932
|
-
# Create the
|
978
|
+
# Create the UI component.
|
933
979
|
@elements << BT.new(@elements.size,hport[1].type.width,:"#{hport[0]}=")
|
934
980
|
end
|
935
981
|
|
982
|
+
# Add a new text input element attached to HDLRuby port +hport+
|
983
|
+
def text(hport)
|
984
|
+
if !hport.is_a?(Hash) or hport.size != 1 then
|
985
|
+
raise UIError.new("Malformed HDLRuby port declaration: #{hport}")
|
986
|
+
end
|
987
|
+
# Create the HDLRuby program port.
|
988
|
+
@program.outport(hport)
|
989
|
+
hport = hport.first
|
990
|
+
# Create the UI component.
|
991
|
+
@elements << TEXT.new(@elements.size,hport[1].type.width,:"#{hport[0]}=")
|
992
|
+
end
|
993
|
+
|
994
|
+
# Add a new hook element attached to HDLRuby port +hport+.
|
995
|
+
# NOTE: a hook element is not displayed on the board but can be used
|
996
|
+
# in the `text` expression.
|
997
|
+
def hook(hport)
|
998
|
+
if !hport.is_a?(Hash) or hport.size != 1 then
|
999
|
+
raise UIError.new("Malformed HDLRuby port declaration: #{hport}")
|
1000
|
+
end
|
1001
|
+
# Create the HDLRuby program port.
|
1002
|
+
@program.inport(hport)
|
1003
|
+
hport = hport.first
|
1004
|
+
# Createthe UI component (invisible)
|
1005
|
+
@elements << HOOK.new(@elements.size,hport[1].type.width,hport[0])
|
1006
|
+
@out_elements << @elements[-1]
|
1007
|
+
end
|
1008
|
+
|
936
1009
|
# Add a new LED element attached to HDLRuby port +hport+.
|
937
1010
|
def led(hport)
|
938
1011
|
if !hport.is_a?(Hash) or hport.size != 1 then
|
@@ -941,7 +1014,7 @@ HTMLRESPONSE
|
|
941
1014
|
# Create the HDLRuby program port.
|
942
1015
|
@program.inport(hport)
|
943
1016
|
hport = hport.first
|
944
|
-
# Createthe
|
1017
|
+
# Createthe UI component.
|
945
1018
|
@elements << LED.new(@elements.size,hport[1].type.width,hport[0])
|
946
1019
|
@out_elements << @elements[-1]
|
947
1020
|
end
|
@@ -1032,6 +1105,35 @@ HTMLRESPONSE
|
|
1032
1105
|
end
|
1033
1106
|
|
1034
1107
|
|
1108
|
+
# Compute a value.
|
1109
|
+
def compute(val)
|
1110
|
+
# Preprocess val to match Ruby syntax.
|
1111
|
+
val = "0" unless val
|
1112
|
+
val = val.gsub("%20"," ")
|
1113
|
+
# Replace the names by the corresponding ports read result.
|
1114
|
+
# val = val.gsub(/([^0-9\.A-Z][_a-z][_a-zA-Z0-9]*)/) do |str|
|
1115
|
+
# RubyHDL.send(Regexp.last_match[1]).to_s rescue 0
|
1116
|
+
# end
|
1117
|
+
val = val.gsub(/([\._a-zA-Z0-9]+)/) do |str|
|
1118
|
+
if str[0] >= "a" && str[0] <= "z" then
|
1119
|
+
# Variable identifier, process it if recognized.
|
1120
|
+
RubyHDL.send(Regexp.last_match[1]).to_s rescue str
|
1121
|
+
else
|
1122
|
+
# Other token leave it as is.
|
1123
|
+
str
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
# Compute.
|
1127
|
+
res = 0
|
1128
|
+
safe = $SAFE
|
1129
|
+
begin
|
1130
|
+
$SAFE = 2
|
1131
|
+
res = eval(val).to_i
|
1132
|
+
rescue SyntaxError => se
|
1133
|
+
end
|
1134
|
+
$SAFE = safe
|
1135
|
+
return res
|
1136
|
+
end
|
1035
1137
|
|
1036
1138
|
# Update port number +id+ with value +val+.
|
1037
1139
|
def update_port(id,val)
|
@@ -1057,8 +1159,17 @@ HTMLRESPONSE
|
|
1057
1159
|
# This should be an AJAX request, process it.
|
1058
1160
|
commands = request.split(";")
|
1059
1161
|
commands.each do |command|
|
1060
|
-
next unless command.include?(":")
|
1061
|
-
id, val = command.split(":").map {|t| t.to_i}
|
1162
|
+
# next unless command.include?(":")
|
1163
|
+
# id, val = command.split(":").map {|t| t.to_i}
|
1164
|
+
id, val = command.split(":",2)
|
1165
|
+
next unless val
|
1166
|
+
id = id.to_i
|
1167
|
+
if val[-1] == "=" then
|
1168
|
+
# This is an expression to compute.
|
1169
|
+
val = self.compute(val.chop)
|
1170
|
+
else
|
1171
|
+
val = val.to_i
|
1172
|
+
end
|
1062
1173
|
self.update_port(id,val)
|
1063
1174
|
end
|
1064
1175
|
# And generate the response: an update of each board output element.
|
data/lib/HDLRuby/version.rb
CHANGED
data/tuto/tutorial_sw.html
CHANGED
@@ -3047,6 +3047,10 @@ end
|
|
3047
3047
|
</li>
|
3048
3048
|
<li><p><code>led</code>: represents a set of LEDs, their number is set to match the bit-width of the attached signal.</p>
|
3049
3049
|
</li>
|
3050
|
+
<li><p><code>text</code>: Represents a text input box whose content is interpreted as an expression. The syntax of the expression follows Ruby, and the available variables include the board's display objects. For example, if a set of LEDs is named <code>leds</code>, it will be accessible as a variable.</p>
|
3051
|
+
</li>
|
3052
|
+
<li><p><code>hook</code>: Attaches a signal to the board without displaying. It can be used as a variable in <code>text</code> expressions, similar to display objects.</p>
|
3053
|
+
</li>
|
3050
3054
|
<li><p><code>hexa</code>: represents a hexadecimal number display, its character width is set to match the width of the largest possible value of the attached signal.</p>
|
3051
3055
|
</li>
|
3052
3056
|
<li><p><code>digit</code>: represents a decimal number display, its character width is set to match the width of the largest possible positive or the smallest possible negative value of the attached signal.</p>
|
data/tuto/tutorial_sw.md
CHANGED
@@ -3750,6 +3750,10 @@ And the comprise the following:
|
|
3750
3750
|
|
3751
3751
|
* `led`: represents a set of LEDs, their number is set to match the bit-width of the attached signal.
|
3752
3752
|
|
3753
|
+
* `text`: Represents a text input box whose content is interpreted as an expression. The syntax of the expression follows Ruby, and the available variables include the board's display objects. For example, if a set of LEDs is named `leds`, it will be accessible as a variable.
|
3754
|
+
|
3755
|
+
* `hook`: Attaches a signal to the board without displaying. It can be used as a variable in `text` expressions, similar to display objects.
|
3756
|
+
|
3753
3757
|
* `hexa`: represents a hexadecimal number display, its character width is set to match the width of the largest possible value of the attached signal.
|
3754
3758
|
|
3755
3759
|
* `digit`: represents a decimal number display, its character width is set to match the width of the largest possible positive or the smallest possible negative value of the attached signal.
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: HDLRuby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lovic Gauthier
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 2025-01-05 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: bundler
|
@@ -488,7 +488,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
488
488
|
- !ruby/object:Gem::Version
|
489
489
|
version: '0'
|
490
490
|
requirements: []
|
491
|
-
rubygems_version: 3.6.
|
491
|
+
rubygems_version: 3.6.2
|
492
492
|
specification_version: 4
|
493
493
|
summary: HDLRuby is a library for describing and simulating digital electronic systems.
|
494
494
|
test_files: []
|