Initialize hlp22-project
1
.env.development
Normal file
|
@ -0,0 +1 @@
|
|||
|
245
.gitignore
vendored
Normal file
|
@ -0,0 +1,245 @@
|
|||
# Output folder
|
||||
app/*.eot
|
||||
app/*.svg
|
||||
app/*.woff
|
||||
app/*.woff2
|
||||
app/*.ttf
|
||||
app/main.js*
|
||||
app/renderer.js*
|
||||
|
||||
|
||||
public/bundle.js*
|
||||
electron/Content/app/main.js*
|
||||
electron/Content/app/renderer.js*
|
||||
|
||||
# Distribution.
|
||||
dist/
|
||||
|
||||
# Diagrams
|
||||
*.dprj
|
||||
|
||||
# Node
|
||||
node_modules/
|
||||
|
||||
# Ionide
|
||||
.ionide
|
||||
|
||||
# Paket
|
||||
/.paket/
|
||||
/paket-files/*
|
||||
|
||||
.config/
|
||||
.vscode/
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Xamarin Studio / monodevelop user-specific
|
||||
*.userprefs
|
||||
*.dll.mdb
|
||||
*.exe.mdb
|
||||
|
||||
# Build results
|
||||
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.log
|
||||
*.scc
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# Other Visual Studio data
|
||||
.vs/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
#[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.Publish.xml
|
||||
|
||||
# Enable nuget.exe in the .nuget folder (though normally executables are not tracked)
|
||||
!.nuget/NuGet.exe
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.[Pp]ublish.xml
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
App_Data/*.mdf
|
||||
App_Data/*.ldf
|
||||
|
||||
|
||||
#LightSwitch generated files
|
||||
GeneratedArtifacts/
|
||||
_Pvt_Extensions/
|
||||
ModelManifest.xml
|
||||
|
||||
# =========================
|
||||
# Windows detritus
|
||||
# =========================
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac desktop service store files
|
||||
.DS_Store
|
||||
|
||||
# ===================================================
|
||||
# Exclude F# project specific directories and files
|
||||
# ===================================================
|
||||
|
||||
# NuGet Packages Directory
|
||||
packages/
|
||||
|
||||
# Generated documentation folder
|
||||
docs/output/
|
||||
|
||||
# Temp folder used for publishing docs
|
||||
temp*/
|
||||
|
||||
# Test results produced by build
|
||||
TestResults.xml
|
||||
TestResult.xml
|
||||
|
||||
# Nuget outputs
|
||||
*.nupkg
|
||||
release.cmd
|
||||
release.sh
|
||||
localpackages/
|
||||
|
||||
*.orig
|
||||
docs/content/license.md
|
||||
docs/content/release-notes.md
|
||||
docs/tools/FSharp.Formatting.svclog
|
||||
|
||||
.ionide.debug
|
||||
*.bak
|
||||
project.lock.json
|
||||
|
||||
# Exclude doc generation and logs
|
||||
docsrc/content/license.md
|
||||
docsrc/content/release-notes.md
|
||||
docsrc/tools/FSharp.Formatting.svclog
|
||||
|
||||
|
||||
|
||||
# FAKE build cache
|
||||
.fake/
|
||||
|
||||
/bin/
|
||||
/dist/
|
||||
!/docsrc/tools
|
||||
!/docsrc/tools/templates
|
||||
!/docsrc/tools/templates/*
|
||||
|
||||
# Fable 3 Output
|
||||
*.fs.js
|
||||
*.fs.js.map
|
||||
|
5
CountLines.cmd
Normal file
|
@ -0,0 +1,5 @@
|
|||
@echo on
|
||||
cls
|
||||
scc --by-file --large-line-count=2000 --no-large -w --include-ext fs src\renderer\common src\renderer\drawblock src\renderer\ui src\renderer\interface src\renderer\simulator
|
||||
|
||||
|
674
LICENSE
Normal file
|
@ -0,0 +1,674 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
674
LICENSE.md
Normal file
|
@ -0,0 +1,674 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
11
Nuget.Config
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<!-- This clears Nuget configuration in the machine to avoid conflicts with Paket -->
|
||||
<packageSources>
|
||||
<clear />
|
||||
<add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
|
||||
</packageSources>
|
||||
<disabledPackageSources>
|
||||
<clear />
|
||||
</disabledPackageSources>
|
||||
</configuration>
|
221
README.md
Normal file
|
@ -0,0 +1,221 @@
|
|||
# Issie - an Interactive Schematic Simulator with Integrated Editor
|
||||
|
||||
Issie (Interactive Schematic Simulator with Integrated Editor) is an application for digital circuit design and simulation. It is targeted at students and hobbyists that want to get a grasp of Digital Electronics concepts in a simple and fun way. Issie is designed to be beginner-friendly and guide the users toward their goals via clear error messages and visual clues. Issie is developed and actively used in teaching at Imperial College London.
|
||||
|
||||
* If you are just interested in using the application, jump to the [Getting Started](#getting-started) section.
|
||||
* If you want user documentation and news go to the [web pages](https://tomcl.github.io/issie/).
|
||||
|
||||
For more technical info about the project, read on. This documentation is partly based on the excellent [VisUAL2](https://github.com/ImperialCollegeLondon/Visual2) documentation, given the similarity in the technology stack used.
|
||||
|
||||
## Introduction
|
||||
|
||||
For the Issie website go [here](https://tomcl.github.io/issie/).
|
||||
|
||||
The application is mostly written in F#, which gets transpiled to JavaScript via the [Fable](https://fable.io/) compiler. [Electron](https://www.electronjs.org/) is then used to convert the developed web-app to a cross-platform application. [Electron](electronjs.org) provides access to platform-level APIs (such as access to the file system) which would not be available to vanilla browser web-apps.
|
||||
|
||||
[Webpack 4](https://webpack.js.org/) is the module bundler responsible for the JavaScript concatenation and automated building process: the electron-webpack build
|
||||
is automated with the all-in-one electron-webpack package.
|
||||
|
||||
The drawing capabilities are provided (now) by a custom schemetic editor library implemented in F# and specialised for digital components.
|
||||
|
||||
The choice of F# as main programming language for the app has been dictated by a few factors:
|
||||
|
||||
* The success of the [VisUAL2](https://github.com/ImperialCollegeLondon/Visual2), which uses a similar technology stack;
|
||||
* Strongly typed functional code tends to be easy to maintain and test, as the type-checker massively helps you;
|
||||
* Imperial College EEE/EIE students learn such language in the 3rd year High-Level-Programming course, hence can maintain the app in the future;
|
||||
* F# can be used with the powerful [Elmish](https://elmish.github.io/elmish/) framework to develop User Interfaces in a [Functional Reactive Programming](https://en.wikipedia.org/wiki/Functional_reactive_programming) fashion.
|
||||
|
||||
## Project Structure
|
||||
|
||||
Electron bundles Chromium (View) and node.js (Engine), therefore as in every node.js project, the `package.json` file specifies the (Node) module dependencies.
|
||||
|
||||
* dependencies: node libraries that the executable code (and development code) needs
|
||||
* dev-dependencies: node libraries only needed by development tools
|
||||
|
||||
Additionally, the section `"scripts"`:
|
||||
```
|
||||
"scripts": {
|
||||
"compile": "dotnet fable src/main && dotnet fable src/renderer",
|
||||
"dev": "cd src/main && dotnet fable watch . --run npm run devrenderer",
|
||||
"devmain": "cd src/main && dotnet fable watch . --run npm run webpackdev",
|
||||
"devrenderer": "cd src/renderer && dotnet fable watch . --run npm run webpackdev",
|
||||
"webpackdev": "electron-webpack dev",
|
||||
"webpack": "electron-webpack",
|
||||
"dist": "npm run compile && npm run webpack && electron-builder",
|
||||
}
|
||||
```
|
||||
Defines the in-project shortcut commands as a set of `<key> : <value` lines, so that when we use `npm run <stript_key>` it is equivalent to calling `<script_value>`.
|
||||
For example, in the root of the project, running in the terminal `npm run dev` is equivalent to the command line:
|
||||
|
||||
```
|
||||
cd src/main && dotnet fable watch . --run npm run devrenderer
|
||||
```
|
||||
|
||||
This runs fable 3 to transpile the main process, then (`--run` is an option of fable to run another command) runs script `devrenderer` to transpile to javascript and watch the F# files in the renderer process. After the renderer transpilation is finished
|
||||
`electron-webpack dev` will be run. This invokes `webpack` to pack and lauch the javascript code, under electron, and also watches for changes in the javascript code, and *hot loads* these on the running application
|
||||
|
||||
As result of this, at any time saving an edited F# renderer project file causes (nearly) immediate:
|
||||
|
||||
* fable transpile to from F# to javascript file (dependent F# files may also be transpiled)
|
||||
* webpack hot load of any changed javascript files to the running electron application
|
||||
|
||||
The build system depends on a `Fake` file `build.fsx`. Fake is a DSL written in F# that is specialised to automate build tasks. Build.fsx has targets representing build tasks, and normally these are run via `build.cmd` or `build.sh`, instead of using `dotnet fake` directly:
|
||||
|
||||
* `build <target>` ==> `dotnet fake build -t <target>`
|
||||
|
||||
## Code Structure
|
||||
|
||||
The source code consists of two distinct sections transpiled separately to Javascript to make a complete Electron application.
|
||||
|
||||
* The electron main process runs the Electron parent process under the desktop native OS, it starts the app process and provides desktop access services to it.
|
||||
* The electron client (app) process runs under Chromium in a simulated browser environment (isolated from the native OS).
|
||||
|
||||
Electron thus allows code written for a browser (HTML + CSS + JavaScript) to be run as a desktop app with the additional capability of desktop filesystem access via communication between the two processes.
|
||||
|
||||
Both processes run Javascript under Node.
|
||||
|
||||
The `src/Main/Main.fs` source configures electron start-up and is boilerplate. It is transpiled to the root project directory so it can be automatically picked up by Electron.
|
||||
|
||||
The remaining app code is arranged in four different sections, each being a separate F# project. This separation allows all the non-web-based code (which can equally be run and tested under .Net) to be run and tested under F# directly in addition to being transpiled and run under Electron.
|
||||
|
||||
The project relies on the draw2d JavaScript (node) library, which is extended to support digital electronics components. The extensions are in the `draw2d` sub-folder of the renderer project source files.
|
||||
|
||||
The code that turns the F# project source into `renderer.js` is the FABLE compiler followed by the Node Webpack bundler that combines multiple Javascript files into a single `renderer.js`.
|
||||
|
||||
The compile process is controlled by the `.fsproj` files (defining the F# source) and `webpack.additions.main.js`, `webpack.additions.renderer.js`
|
||||
which define how Webpack combines F# outputs for both electron main and electron app processes and where the executable code is put.
|
||||
This is boilerplate which you do not need to change; normally the F# project files are all that needs to be modified.
|
||||
|
||||
## File Structure
|
||||
|
||||
### `src` folder
|
||||
|
||||
| Subfolder | Description |
|
||||
|:------------:|:--------------------------------------------------------------------------------------------------:|
|
||||
| `main/` | Code for the main electron process that sets everything up - not normally changed |
|
||||
| `Common/` | Provides some common types and utilities used by all other sections, including the WidthInferer |
|
||||
| `Simulator/` | Contains the logic to analyse and simulate a diagram. |
|
||||
| `Renderer/` | Contains the UI logic, the wrapper to the JavaScript drawing library and a set of utility function to write/read/parse diagram files. This amd `main` are the only projects that cannot run under .Net, as they contain JavaScript related functionalities. |
|
||||
|
||||
### `Tests` folder
|
||||
|
||||
Contains numerous tests for the WidthInferer and Simulator. Based on F# Expecto testing library.
|
||||
|
||||
|
||||
### `Static` folder
|
||||
|
||||
Contains static files used in the application.
|
||||
|
||||
### `Docs` folder
|
||||
|
||||
Contains source information copied (or compiled) into the `docs` directory that controls the project
|
||||
[Github Pages](https://pages.github.com/) website, with url [https://tomcl.github.io/issie/](https://tomcl.github.io/issie/).
|
||||
|
||||
## Project versus File in the Issie application
|
||||
|
||||
Issie allows the users to create projects and files within those projects. A Issie project is simply a folder named `<project-name>` that contains an empty file named `<project_name>.dprj` (dprj stands for diagram project). The project folder any non-zero number of design files, each named `<component_name>.dgm` (dgm stands for diagram). each deisgn file represents one design sheet of a hierarchical hardware design, sheets can contain, as components, other sheets.
|
||||
|
||||
When opening a project, Issie will initially search the given repository for `.dgm` files, parse and load their content, and allow the user to open them in Issie or use them as components in other designs.
|
||||
|
||||
## Build Magic
|
||||
|
||||
This project uses modern F# / dotnet cross-platform build. The build process does not normally concern a developer, but here is an overview for if it needs to be adjusted.
|
||||
|
||||
* Before anything can be built Dotnet & Node.js are manually be (globally) installed. Dotnet includes the `paket` tool which will manage other dotnet-related dependencies. Node.js includes `npm` which will do the same for Node-related dependencies. NB - there are other popular packet managers for Node, e.g. Yarn. They do not mix with npm, so make sure you do not use them. Confusingly, they will sort-of work, but cause install incompatibilities.
|
||||
* Dotnet dependencies are executable programs or libraries that run under dotnet and are written in C#'. F#, etc.
|
||||
* Node dependencies are (always) Javascript modules which run under node.
|
||||
* Initially (the first time `build.cmd` is run) the build tools categorised in `dotnet-tools.json` are installed by `dotnet tool restore`.
|
||||
* fake (with the F# compiler)
|
||||
* fable
|
||||
* Next all the project Dotnet dependencies (`paket.dependencies` for the whole project, selected from by the `paket.references` in each project directory, are loaded by the `paket` packet manager.
|
||||
* Finally fake runs `build.fsx` (this is platform-independent) which uses `npm` to install all the node (Javascript) dependencies listed in `package.json`. That includes tools like webpack and electron, which run under node, as well as the node libraries that will be used by needed by the running electron app, including electron itself. These are all loaded by the `npm` packet manager.
|
||||
|
||||
## Getting Started
|
||||
|
||||
If you just want to run the app go to the [releases page](https://github.com/tomcl/issie/releases) and
|
||||
download and run the latest prebuilt binary for your platform (Windows or Macos). Issie will require in total about 200M of disk space.
|
||||
|
||||
* Windows: unzip \*.zip anywhere and double-click the top-level `Issie.exe` application in the unzipped files.
|
||||
* Macos: Double click the dmg file and run the application inside the folder, or drag and drop this to install.
|
||||
* The binaries are not signed. You will need to [perform a one-off security bypass](https://www.wikihow.com/Install-Software-from-Unsigned-Developers-on-a-Mac).
|
||||
|
||||
###
|
||||
|
||||
Issie installs and runs without making system changes - all of its code is inside the directory you download. You can delete this and replace it by a later version of Issie. Each design sheet is stored in a similarly named file under the porject directory. The subdirectory `backup` there contains a large numbers of backup snapshots for design recovery. These are not needed for Issie operation so you can delete them - or even the whole `backup` directory, if you wish.
|
||||
|
||||
## Getting Started as Developer
|
||||
|
||||
If you want to get started as a developer, follow these steps.
|
||||
|
||||
### Development Install Prerequisites
|
||||
|
||||
Download and install (if you already have these tools installed just check the version constraints).
|
||||
|
||||
|
||||
* [.Net 6 SDK](https://dotnet.microsoft.com/download/dotnet/5.0). Version >= 6.0
|
||||
* [Node.js v14](https://nodejs.org/dist/latest-v14.x/). **Version 12 or (preferably) v14 - NOT latest 16**
|
||||
* Node.js includes the `npm` package manager, so this does not need to be installed separately.
|
||||
* The lastest LTS version of Node is now v16. That will currently NOT work.
|
||||
* If you are using a different version of Node for developmnet on oytehr projects, global install
|
||||
(the default) may interfere with this. You will need to do a more complex local node install.
|
||||
* (recommended) Visual Studio 2022 which includes F# 6.0
|
||||
* (recommended) install [hyper.js](https://hyper.is/) to have a good command line interface - anything else you like will do.
|
||||
|
||||
### Issie Development
|
||||
|
||||
1. Download & unzip the [Issie repo](https://github.com/tomcl/ISSIE), or if contributing clone it locally, or fork it on github and then clone it locally. Make sure you are contributing to the Issie repo - not the Issie parent repo, if cloning (Github desktop gives you this option when you clone).
|
||||
|
||||
3. Navigate to the project root directory (which contains this README) in a command-line interpreter. For Windows usage make sure if possible for convenience
|
||||
that you have a _tabbed_ command-line interpreter that can be started direct from file explorer within a specific directory (by right-clicking on the explorer directory view).
|
||||
That makes things a lot more pleasant. The new [Windows Terminal](https://github.com/microsoft/terminal) works well.
|
||||
|
||||
4. Run `build.cmd` under Windows or `build.sh` under linux or macos. This will download and install all dependencies then launch the application with HMR.
|
||||
|
||||
* HMR: the application will automatically recompile and update while running if you save updated source files
|
||||
* To initialise and reload: `File -> reload page`
|
||||
* To exit: after you exit the application the auto-compile script will terminate after about 15s
|
||||
* To recompile the application `npm run dev` or `npm run devfast` (devfast switches off some debugging to make simulation run a lot faster).
|
||||
* To generate distributable binaries for dev host system `npm run dist`.
|
||||
* If you have changed node modules use `build dev`. Note that this project uses npm, not yarn. If npm gets stuck use `build cleannode` and try again.
|
||||
* From time to time run `build killzombies` to terminate orphan node and dotnet processes which accumulate using this dev chain. (Not sure if this is still needed)
|
||||
|
||||
#### Development on Macos
|
||||
|
||||
In theory the build should work equally well on macos. Practically that is now (10/2021) the case. Having installed the normal prerequisites, and Visual Studio for Mac, which itself has the F# compiler, the one-off setup can be done manually from the various build steps needed:
|
||||
|
||||
* git clone to local project directory as normal (with github desktop or command line git - one off)
|
||||
* dotnet tool restore (build tools - one off)
|
||||
* dotnet paket install (install dotnet packages one off)
|
||||
* npm install (install node packages - one off)
|
||||
* npm run dev (run the dev envt)
|
||||
|
||||
|
||||
One unresolved issue that can occur on Macs is file permission problems. Best practice is for all installation and dev to run under the current (non-admin) user. If any part of the necessary downloaded development files gets written as root then subsequent development commands that modify it will need to be executed using sudo.
|
||||
|
||||
```
|
||||
sudo npm run devfast
|
||||
```
|
||||
|
||||
If possible, try to avoid this, but if necessary it can be done. Probably the better solution is to investigate properly which install steps introduce these root owner files, change the file ownership back to current user with `chown -R <username> <directory>`. Please document any progress made with mac builds (detailing which mac OS) on an issue.
|
||||
|
||||
|
||||
## Reinstalling Compiler and Libraries
|
||||
|
||||
To reinstall the build environment (without changing project code) rerun `build.cmd` (Windows) or `build.sh` (Linux and MacOS). You may need first to
|
||||
run `build killzombies` to remove orphan processes that lock build files.
|
||||
|
||||
## Creating binaries
|
||||
|
||||
`npm run dist` will generate the correct binaries for your system under `/dist`.
|
||||
|
||||
* There is a very rare bug in the code that downloads electron binaries that is sensitive to fast internet access:
|
||||
going through a VPN makes it go away. It is one-off since the binaries are cached once downloaded. If this hits you
|
||||
the workaround is to run the build script again using Imperial College VPN. Having downloaded the binaries once
|
||||
the porblem will go away.
|
||||
|
||||
## TODO
|
||||
|
||||
|
||||
* Should Node be upgraded to v14?
|
||||
* Clean up Paket dependencies
|
||||
|
20
RELEASE_NOTES.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
### v0.5.0 - Issie 1st release
|
||||
|
||||
* Change name to Issie - Interative Simulation and Schematic Integrated Editor.
|
||||
* Mend build system - now HMR works.
|
||||
* Breaking change - alter size of NOT gates => any old sheet with the NOT gates will crash the software on load.
|
||||
|
||||
### v0.4.0 - DECAD 1st release
|
||||
|
||||
* Major update to build system.
|
||||
* Upgrade all packages to latest.
|
||||
* Mend bug in loading of exact wire and bus positions.
|
||||
* Change name to DECAD.
|
||||
|
||||
### 0.2 - March, 2020
|
||||
|
||||
* End of FYP Release
|
||||
|
||||
### v0.1-beta
|
||||
|
||||
* User feedback release
|
738
Tests/CanvasStates.fs
Normal file
|
@ -0,0 +1,738 @@
|
|||
module CanvasStates
|
||||
|
||||
open CommonTypes
|
||||
|
||||
// Guidelines to create states:
|
||||
// - draw the diagram you want to test in the actual application, then log its
|
||||
// state state. Use logStateToFSharp.py to transform the log output into
|
||||
// a (almost) valid FSharp data structure.
|
||||
// - write it from scratch. Remember:
|
||||
// --> each component Id must be unique
|
||||
// --> each connection Id must be unique
|
||||
// --> each port Id must be unique
|
||||
|
||||
let makeCustomComponent (dep:LoadedComponent) = {
|
||||
Name = dep.Name
|
||||
InputLabels = dep.InputLabels
|
||||
OutputLabels = dep.OutputLabels
|
||||
}
|
||||
|
||||
/// Just a single input node. No conections.
|
||||
let state1 : CanvasState =
|
||||
[
|
||||
{
|
||||
Id = "input-node0";
|
||||
Type = Input 1;
|
||||
Label = "input-node0-label";
|
||||
InputPorts = [];
|
||||
OutputPorts = [{
|
||||
Id = "out-port0";
|
||||
PortNumber = Some 0;
|
||||
PortType = PortType.Output;
|
||||
HostId = "input-node0"
|
||||
}];
|
||||
X = 169;
|
||||
Y = 175
|
||||
H=50;
|
||||
W=40;
|
||||
}
|
||||
],
|
||||
[]
|
||||
|
||||
/// State1 loaded as a dependency.
|
||||
let state1Dependency : LoadedComponent = {
|
||||
Name = "broken-one-input"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state1
|
||||
InputLabels = ["input-node0", 1]
|
||||
OutputLabels = []
|
||||
}
|
||||
|
||||
/// State1 custom component.
|
||||
let state1CustomComponent : CustomComponentType =
|
||||
makeCustomComponent state1Dependency
|
||||
|
||||
/// Two unconnected input nodes. No conections.
|
||||
let state2 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "input-node0-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "input-node1"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "input-node1-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node1"}]; X = 169; Y = 175}
|
||||
],
|
||||
[]
|
||||
|
||||
/// Simple circuit with one input connected to one output.
|
||||
let state3 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
],
|
||||
[
|
||||
{ Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// State3 loaded as a dependency.
|
||||
let state3Dependency : LoadedComponent = {
|
||||
Name = "input-output"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state3
|
||||
InputLabels = ["input-node0-label", 1]
|
||||
OutputLabels = ["output-node0-label", 1]
|
||||
}
|
||||
|
||||
/// State3 custom component.
|
||||
let state3CustomComponent : CustomComponentType =
|
||||
makeCustomComponent state3Dependency
|
||||
|
||||
/// Simple circuit with one input connected to two outputs.
|
||||
let state4 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-node0-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{ H=50; W=40; Id = "output-node1"; Type = Output 1; Label = "output-node1-label"; InputPorts = [{Id = "output-node1-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node1"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
],
|
||||
[
|
||||
{ Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node0-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
|
||||
{ Id = "conn1"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node1-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node1"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Two inputs connected to the same output.
|
||||
let state5 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "input-node0-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "input-node1"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "input-node1-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node1"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
],
|
||||
[
|
||||
{ Id = "conn0"; Source = {Id = "input-node0-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
|
||||
{ Id = "conn1"; Source = {Id = "input-node1-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node1"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Two inputs; one And; one output.
|
||||
let state6 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Two inputs; one And; one output; with extra connection input to output.
|
||||
let state7 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
{Id = "conn3"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Two inputs; one And; one output; with extra connections inputs to and.
|
||||
let state8 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
{Id = "conn3"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn4"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Mux2 with only two connected ports.
|
||||
let state9 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{ H=50; W=40; Id = "mux"; Type = Mux2; Label = ""; InputPorts = [{Id = "mux-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "mux"}; {Id = "mux-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "mux"}; {Id = "mux-in2"; PortNumber = Some 2; PortType = PortType.Input; HostId = "mux"};]; OutputPorts = [{Id = "mux-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "mux"}]; X = 428; Y = 459}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "mux-in0"; PortNumber = None; PortType = PortType.Input; HostId = "mux"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "mux-in1"; PortNumber = None; PortType = PortType.Input; HostId = "mux"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "mux-out0"; PortNumber = None; PortType = PortType.Output; HostId = "mux"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Complex diagram with 3 Ands; one input; one output and 2 cycles (yet all
|
||||
/// ports are connected prpoerly).
|
||||
let state10 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79}
|
||||
{ H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187}
|
||||
{ H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245}
|
||||
{ H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
|
||||
{Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
|
||||
{Id = "conn4"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
|
||||
{Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
|
||||
{Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Complex diagram with 3 Ands; one input; one output and 1 cycles with three
|
||||
/// components (yet all ports are connected prpoerly).
|
||||
let state11 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79}
|
||||
{ H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187}
|
||||
{ H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245}
|
||||
{ H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
|
||||
{Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
|
||||
{Id = "conn4"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
|
||||
{Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
|
||||
{Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Complex diagram with 3 Ands; one input; one output and no cycles.
|
||||
let state12 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79}
|
||||
{ H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187}
|
||||
{ H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245}
|
||||
{ H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
|
||||
{Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
|
||||
{Id = "conn4"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
|
||||
{Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
|
||||
{Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// One bit adder.
|
||||
let state13 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id="2953603d-44e4-5c1f-3fb1-698f7863b6b5";Type=Input 1;Label="A";InputPorts=[];OutputPorts=[{Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber= Some 0;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"}];X=97;Y=111}
|
||||
{ H=50; W=40; Id="170e69f4-b3d7-d9e0-9f1d-6a564ba62062";Type=Input 1;Label="B";InputPorts=[];OutputPorts=[{Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber= Some 0;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"}];X=54;Y=203}
|
||||
{ H=50; W=40; Id="253e21f0-b062-4858-c315-5a5315cadf45";Type=And;Label="";InputPorts=[{Id="1b2c73d1-b38e-64e6-5b19-e4e7f690a692";PortNumber= Some 0;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; {Id="9fdb22f6-f8eb-829f-68b3-87b9c8577299";PortNumber= Some 1;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}];OutputPorts=[{Id="95a03834-e494-92b2-b8d4-a148e3c0763b";PortNumber= Some 0;PortType=PortType.Output;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}];X=498;Y=208}
|
||||
{ H=50; W=40; Id="6b7bac71-eec5-4979-834a-c1bfe40d77b9";Type=Xor;Label="";InputPorts=[{Id="6a468f2c-4db4-d3ae-402f-a617885884e7";PortNumber= Some 0;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; {Id="9826a9b5-cd62-51ec-6368-93c4967745f9";PortNumber= Some 1;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}];OutputPorts=[{Id="7cb01ee2-49d4-00b5-7523-14e4de3c5489";PortNumber= Some 0;PortType=PortType.Output;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}];X=501;Y=108}
|
||||
{ H=50; W=40; Id="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9";Type=Output 1;Label="Sum";InputPorts=[{Id="14b23a60-21ae-374f-d083-41aa2510eeab";PortNumber= Some 0;PortType=PortType.Input;HostId="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9"}];OutputPorts=[];X=691;Y=122}
|
||||
{ H=50; W=40; Id="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34";Type=Output 1;Label="Carry";InputPorts=[{Id="b9d457f7-dcef-89a1-aa76-b9ba7f9ca3f4";PortNumber= Some 0;PortType=PortType.Input;HostId="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34"}];OutputPorts=[];X=692;Y=223}
|
||||
],
|
||||
[
|
||||
{Id="79df6e40-7ad2-b1d2-cb98-ea5d649ef1cc";Source={Id="7cb01ee2-49d4-00b5-7523-14e4de3c5489";PortNumber=None;PortType=PortType.Output;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"};Target={Id="14b23a60-21ae-374f-d083-41aa2510eeab";PortNumber=None;PortType=PortType.Input;HostId="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9"}; Vertices = []}
|
||||
{Id="6b066c26-750b-6eb3-2516-bc122899f846";Source={Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber=None;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"};Target={Id="9fdb22f6-f8eb-829f-68b3-87b9c8577299";PortNumber=None;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; Vertices = []}
|
||||
{Id="5f7c6896-8fbd-bfaf-ee0f-a677f7804283";Source={Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber=None;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"};Target={Id="9826a9b5-cd62-51ec-6368-93c4967745f9";PortNumber=None;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; Vertices = []}
|
||||
{Id="8ed22d89-b542-a182-fef9-1a67170da60e";Source={Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber=None;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"};Target={Id="1b2c73d1-b38e-64e6-5b19-e4e7f690a692";PortNumber=None;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; Vertices = []}
|
||||
{Id="0cd3f109-22ee-3543-7247-db2b4ffe5fc8";Source={Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber=None;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"};Target={Id="6a468f2c-4db4-d3ae-402f-a617885884e7";PortNumber=None;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; Vertices = []}
|
||||
{Id="3230b338-cdd4-7632-e441-9d2f50df013a";Source={Id="95a03834-e494-92b2-b8d4-a148e3c0763b";PortNumber=None;PortType=PortType.Output;HostId="253e21f0-b062-4858-c315-5a5315cadf45"};Target={Id="b9d457f7-dcef-89a1-aa76-b9ba7f9ca3f4";PortNumber=None;PortType=PortType.Input;HostId="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Similar to state4, but output nodes have the same label.
|
||||
let state14 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-duplicate-label"; InputPorts = [{Id = "output-node0-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{ H=50; W=40; Id = "output-node1"; Type = Output 1; Label = "output-duplicate-label"; InputPorts = [{Id = "output-node1-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node1"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node0-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node1-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node1"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Similar to state6, but input nodes have the same label.
|
||||
let state15 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-duplicate-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-duplicate-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// One input and one output, connected to the state3CustomComponent.
|
||||
let state16 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "outer-output-node0-label"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "inp-out-component"; Type = Custom state3CustomComponent; Label = "inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
|
||||
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// State16 loaded as a dependency.
|
||||
let state16Dependency : LoadedComponent = {
|
||||
Name = "nested-input-output"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state16
|
||||
InputLabels = ["outer-input-node0-label", 1]
|
||||
OutputLabels = ["outer-output-node0-label", 1]
|
||||
}
|
||||
|
||||
/// State16 custom component.
|
||||
let state16CustomComponent : CustomComponentType =
|
||||
makeCustomComponent state16Dependency
|
||||
|
||||
/// One input and one output, connected to the state16CustomComponent, which
|
||||
/// contains the state3CustomComponent.
|
||||
let state17 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-outer-input-node0"; Type = Input 1; Label = "outer-outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-outer-output-node0"; Type = Output 1; Label = "outer-outer-output-node0-label"; InputPorts = [{Id = "outer-outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "wrapped-inp-out-component"; Type = Custom state3CustomComponent; Label = "wrapped-inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "wrapped-inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "wrapped-inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "wrapped-inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "wrapped-inp-out-component"};
|
||||
Target = {Id = "outer-outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// State17 loaded as a dependency.
|
||||
let state17Dependency : LoadedComponent = {
|
||||
Name = "doubly-nested-input-output"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state17
|
||||
InputLabels = ["outer-outer-input-node0-label", 1]
|
||||
OutputLabels = ["outer-outer-output-node0-label", 1]
|
||||
}
|
||||
|
||||
/// State17 custom component.
|
||||
let state17CustomComponent : CustomComponentType =
|
||||
makeCustomComponent state17Dependency
|
||||
|
||||
/// One input and one output, connected to the state17CustomComponent, which
|
||||
/// contains state16CustomComponent, which contains the state3CustomComponent.
|
||||
let state18 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-outer-outer-input-node0"; Type = Input 1; Label = "outer-outer-outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-outer-outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-outer-outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-outer-outer-output-node0"; Type = Output 1; Label = "outer-outer-outer-output-node0-label"; InputPorts = [{Id = "outer-outer-outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-outer-outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "doubly-wrapped-inp-out-component"; Type = Custom state3CustomComponent; Label = "doubly-wrapped-inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "doubly-wrapped-inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "doubly-wrapped-inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-outer-outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-outer-outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "doubly-wrapped-inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "doubly-wrapped-inp-out-component"};
|
||||
Target = {Id = "outer-outer-outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-outer-outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// One input connected to a broken dependency.
|
||||
let state19 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "broken-input"; Type = Custom state1CustomComponent; Label = "broken-input-label"; InputPorts = [{Id = "broken-input-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "broken-input"}]; OutputPorts = []; X = 169; Y = 175}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0"
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}
|
||||
Target = {Id = "broken-input-port0"; PortNumber = None; PortType = PortType.Input; HostId = "broken-input"}
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// Similar to state16, but uses state16CustomComponent instead of
|
||||
/// state3CustomComponent to create a cycle.
|
||||
let state20 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "outer-output-node0-label"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "inp-out-component"; Type = Custom state16CustomComponent; Label = "inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
|
||||
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
// Test a long dependecy cycle.
|
||||
// state21 --> state22 --> state23 --> state21
|
||||
|
||||
let state21CustomComponent : CustomComponentType = {
|
||||
Name = "21-custom-component"
|
||||
InputLabels = ["21-inp", 1]
|
||||
OutputLabels = ["21-out", 1]
|
||||
}
|
||||
|
||||
let state22CustomComponent : CustomComponentType = {
|
||||
Name = "22-custom-component"
|
||||
InputLabels = ["22-inp", 1]
|
||||
OutputLabels = ["22-out", 1]
|
||||
}
|
||||
|
||||
let state23CustomComponent : CustomComponentType = {
|
||||
Name = "23-custom-component"
|
||||
InputLabels = ["23-inp", 1]
|
||||
OutputLabels = ["23-out", 1]
|
||||
}
|
||||
|
||||
/// Simple input-output component that uses state22.
|
||||
let state21 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "21-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "21-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "inp-out-component"; Type = Custom state22CustomComponent; Label = "inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
|
||||
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// Simple input-output component that uses state23.
|
||||
let state22 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "22-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "22-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "inp-out-component"; Type = Custom state23CustomComponent; Label = "inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
|
||||
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// Simple input-output component that uses state21.
|
||||
let state23 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "23-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "23-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "inp-out-component"; Type = Custom state21CustomComponent; Label = "inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
|
||||
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
let state21Dependency : LoadedComponent = {
|
||||
Name = "21-custom-component"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state21
|
||||
InputLabels = ["21-inp", 1]
|
||||
OutputLabels = ["21-out", 1]
|
||||
}
|
||||
|
||||
let state22Dependency : LoadedComponent = {
|
||||
Name = "22-custom-component"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state22
|
||||
InputLabels = ["22-inp", 1]
|
||||
OutputLabels = ["22-out", 1]
|
||||
}
|
||||
|
||||
let state23Dependency : LoadedComponent = {
|
||||
Name = "23-custom-component"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = state23
|
||||
InputLabels = ["23-inp", 1]
|
||||
OutputLabels = ["23-out", 1]
|
||||
}
|
||||
|
||||
/// Simple input-output component that uses state23.
|
||||
let state24 : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "24-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
|
||||
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "24-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
|
||||
{
|
||||
H=50; W=40; Id = "inp-out-component"; Type = Custom state23CustomComponent; Label = "inp-out-component-label";
|
||||
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
|
||||
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
|
||||
X = 169; Y = 175
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
Id = "conn0";
|
||||
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
|
||||
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
|
||||
Vertices = []
|
||||
}
|
||||
{
|
||||
Id = "conn1";
|
||||
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
|
||||
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
|
||||
Vertices = []
|
||||
}
|
||||
]
|
||||
|
||||
/// Similar to state6, but with a missing connection from bottom input to and.
|
||||
let state25 : CanvasState =
|
||||
[
|
||||
{H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Similar to state6, but with a missing connection from and to output.
|
||||
let state26 : CanvasState =
|
||||
[
|
||||
{H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
|
||||
]
|
||||
|
||||
/// Similar to state6, but with both inputs unconnected.
|
||||
let state27 : CanvasState =
|
||||
[
|
||||
{H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
|
||||
{H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
|
||||
{H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
|
||||
{H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
|
||||
],
|
||||
[
|
||||
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
|
||||
]
|
||||
|
||||
// Half adder.
|
||||
|
||||
let halfAdderState : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"; Type = Input 1; Label = "B"; InputPorts = []; OutputPorts = [{Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = Some 0; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}]; X = 100; Y = 195}
|
||||
{ H=50; W=40; Id = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"; Type = Input 1; Label = "A"; InputPorts = []; OutputPorts = [{Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = Some 0; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}]; X = 100; Y = 100}
|
||||
{ H=50; W=40; Id = "7227d00f-d329-af58-b769-0bf42ee6f2ef"; Type = And; Label = ""; InputPorts = [{Id = "49c3e9ab-4ad5-0c6c-cda9-987a820ad1c5"; PortNumber = Some 0; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; {Id = "7d121026-401b-72e5-2051-3497b65d99b3"; PortNumber = Some 1; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}]; OutputPorts = [{Id = "45d7d345-38f8-0933-a86c-16159674e4a0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}]; X = 267; Y = 179}
|
||||
{ H=50; W=40; Id = "5ea2bff6-ee86-e729-5c14-a52b302af517"; Type = Xor; Label = ""; InputPorts = [{Id = "1e8be0a9-1c87-e877-3e7b-a6335f5ddad4"; PortNumber = Some 0; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; {Id = "77dfc4b4-6616-6768-7c35-8c3c1c26acbd"; PortNumber = Some 1; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}]; OutputPorts = [{Id = "27537cac-d2b0-dd3d-e0ee-a6f27d2e793e"; PortNumber = Some 0; PortType = PortType.Output; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}]; X = 267; Y = 97}
|
||||
{ H=50; W=40; Id = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"; Type = Output 1; Label = "Sum"; InputPorts = [{Id = "26723054-cb13-f8b2-3a5d-ae8224d532e1"; PortNumber = Some 0; PortType = PortType.Input; HostId = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"}]; OutputPorts = []; X = 420; Y = 107}
|
||||
{ H=50; W=40; Id = "56dd9000-1a54-8040-3e90-33e44ce390b9"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "617c8ca8-d4b3-182f-b8d1-ce7f4b6a5359"; PortNumber = Some 0; PortType = PortType.Input; HostId = "56dd9000-1a54-8040-3e90-33e44ce390b9"}]; OutputPorts = []; X = 420; Y = 189}
|
||||
],
|
||||
[
|
||||
{Id = "5751a3dc-26e0-2df2-d797-af37b357f7bd"; Source = {Id = "27537cac-d2b0-dd3d-e0ee-a6f27d2e793e"; PortNumber = None; PortType = PortType.Output; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Target = {Id = "26723054-cb13-f8b2-3a5d-ae8224d532e1"; PortNumber = None; PortType = PortType.Input; HostId = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"}; Vertices = [307.0,117.0; 420.0,117.0]}
|
||||
{Id = "4d823d53-2991-68a4-a72b-7c3aec1e6b75"; Source = {Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = None; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}; Target = {Id = "7d121026-401b-72e5-2051-3497b65d99b3"; PortNumber = None; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Vertices = [130.0,205.0; 198.5,205.0; 198.5,205.66666666666666; 267.0,205.66666666666666]}
|
||||
{Id = "3491b238-ea58-d04a-8d55-78b630507094"; Source = {Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = None; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}; Target = {Id = "49c3e9ab-4ad5-0c6c-cda9-987a820ad1c5"; PortNumber = None; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Vertices = [130.0,110.0; 170.5,110.0; 170.5,192.33333333333334; 267.0,192.33333333333334]}
|
||||
{Id = "9c7f868c-0411-eeaf-eefe-9923ae6a66bd"; Source = {Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = None; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}; Target = {Id = "1e8be0a9-1c87-e877-3e7b-a6335f5ddad4"; PortNumber = None; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Vertices = [130.0,110.0; 198.5,110.0; 198.5,110.33333333333333; 267.0,110.33333333333333]}
|
||||
{Id = "c5c8d60b-712d-b182-aaf1-b902c1eb4b7b"; Source = {Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = None; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}; Target = {Id = "77dfc4b4-6616-6768-7c35-8c3c1c26acbd"; PortNumber = None; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Vertices = [130.0,205.0; 198.5,205.0; 198.5,123.66666666666667; 267.0,123.66666666666667]}
|
||||
{Id = "712471ca-270a-0410-a9e5-a7894a6c2df4"; Source = {Id = "45d7d345-38f8-0933-a86c-16159674e4a0"; PortNumber = None; PortType = PortType.Output; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Target = {Id = "617c8ca8-d4b3-182f-b8d1-ce7f4b6a5359"; PortNumber = None; PortType = PortType.Input; HostId = "56dd9000-1a54-8040-3e90-33e44ce390b9"}; Vertices = [307.0,199.0; 420.0,199.0]}
|
||||
]
|
||||
|
||||
let halfAdderDependency : LoadedComponent = {
|
||||
Name = "half-adder"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = halfAdderState
|
||||
InputLabels = ["A", 1; "B", 1]
|
||||
OutputLabels = ["Cout", 1; "Sum", 1]
|
||||
}
|
||||
|
||||
let halfAdderCustom : CustomComponentType =
|
||||
makeCustomComponent halfAdderDependency
|
||||
|
||||
// Full adder: uses half adder.
|
||||
|
||||
let fullAdderState : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"; Type = Custom {Name = "half-adder"; InputLabels = ["A", 1; "B", 1]; OutputLabels = ["Cout", 1; "Sum", 1]}; Label = "half-adder"; InputPorts = [{Id = "bab6da29-c4fe-adae-c94b-ada53dc9b948"; PortNumber = Some 0; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; {Id = "6ff179d8-a703-eed2-c948-a214c0aff3a9"; PortNumber = Some 1; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}]; OutputPorts = [{Id = "0b68efeb-91be-da25-c7c5-dfa1b76b105b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; {Id = "60b550b8-37d9-a0b8-c55c-cfc0044ef147"; PortNumber = Some 1; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}]; X = 187; Y = 200}
|
||||
{ H=50; W=40; Id = "2c610c78-72b7-2816-fec5-a53d2fa54742"; Type = Input 1; Label = "A"; InputPorts = []; OutputPorts = [{Id = "51e83d48-e73b-0961-3ebe-f488e7f89326"; PortNumber = Some 0; PortType = PortType.Output; HostId = "2c610c78-72b7-2816-fec5-a53d2fa54742"}]; X = 95; Y = 171}
|
||||
{ H=50; W=40; Id = "7e461ed2-53f6-c225-e184-91d24532ef33"; Type = Input 1; Label = "B"; InputPorts = []; OutputPorts = [{Id = "1eaa9bb4-0fa1-4fb3-0792-fe36b5d94886"; PortNumber = Some 0; PortType = PortType.Output; HostId = "7e461ed2-53f6-c225-e184-91d24532ef33"}]; X = 95; Y = 265}
|
||||
{ H=50; W=40; Id = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"; Type = Custom {Name = "half-adder"; InputLabels = ["A", 1; "B", 1]; OutputLabels = ["Cout", 1; "Sum", 1]}; Label = "half-adder"; InputPorts = [{Id = "15575f10-2ec6-6033-cd3a-3ddabda8dbf3"; PortNumber = Some 0; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; {Id = "7cdb3ebb-cfa1-6892-9d35-de8f15cb87ac"; PortNumber = Some 1; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}]; OutputPorts = [{Id = "093b66de-366d-40fc-a3b5-2c2d396d7fb5"; PortNumber = Some 0; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; {Id = "8cbfb956-5d53-aa0f-2546-ff32426901d1"; PortNumber = Some 1; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}]; X = 323; Y = 108}
|
||||
{ H=50; W=40; Id = "eddfd0f6-f06d-5190-3af9-540371a13391"; Type = Input 1; Label = "Cin"; InputPorts = []; OutputPorts = [{Id = "042a92cb-f8d7-3cca-7519-a0bae85fdb6b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "eddfd0f6-f06d-5190-3af9-540371a13391"}]; X = 100; Y = 70}
|
||||
{ H=50; W=40; Id = "d8087733-5924-4af4-e67a-2c9630173608"; Type = Or; Label = ""; InputPorts = [{Id = "f812e552-daab-73d0-cfa0-de0190279c8d"; PortNumber = Some 0; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; {Id = "d25307aa-412f-d108-0f70-335b4e331f52"; PortNumber = Some 1; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}]; OutputPorts = [{Id = "93f988ff-3b92-1904-2dcb-17ec5e88178f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}]; X = 481; Y = 196}
|
||||
{ H=50; W=40; Id = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "17f9e9e2-3040-65ba-9578-b4ea6a8f8b28"; PortNumber = Some 0; PortType = PortType.Input; HostId = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"}]; OutputPorts = []; X = 567; Y = 206}
|
||||
{ H=50; W=40; Id = "434a7ce9-942f-0939-94eb-8dd7162ad916"; Type = Output 1; Label = "Sum"; InputPorts = [{Id = "f7ed4610-faf3-e0cb-d985-86f6da5fa148"; PortNumber = Some 0; PortType = PortType.Input; HostId = "434a7ce9-942f-0939-94eb-8dd7162ad916"}]; OutputPorts = []; X = 567; Y = 138}
|
||||
],
|
||||
[
|
||||
{Id = "67479e2e-468f-ebe6-7fa8-fe4e7e25efac"; Source = {Id = "51e83d48-e73b-0961-3ebe-f488e7f89326"; PortNumber = None; PortType = PortType.Output; HostId = "2c610c78-72b7-2816-fec5-a53d2fa54742"}; Target = {Id = "bab6da29-c4fe-adae-c94b-ada53dc9b948"; PortNumber = None; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Vertices = [125.0,181.0; 156.0,181.0; 156.0,220.0; 187.0,220.0]}
|
||||
{Id = "b658d7c4-7b6a-4c9d-7cbc-19f6b25d3631"; Source = {Id = "1eaa9bb4-0fa1-4fb3-0792-fe36b5d94886"; PortNumber = None; PortType = PortType.Output; HostId = "7e461ed2-53f6-c225-e184-91d24532ef33"}; Target = {Id = "6ff179d8-a703-eed2-c948-a214c0aff3a9"; PortNumber = None; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Vertices = [125.0,275.0; 156.0,275.0; 156.0,240.0; 187.0,240.0]}
|
||||
{Id = "c7cf8ab2-7521-b09c-e4f8-4d09f0913d4f"; Source = {Id = "0b68efeb-91be-da25-c7c5-dfa1b76b105b"; PortNumber = None; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Target = {Id = "d25307aa-412f-d108-0f70-335b4e331f52"; PortNumber = None; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Vertices = [247.0,220.0; 364.0,220.0; 364.0,222.66666666666666; 481.0,222.66666666666666]}
|
||||
{Id = "3330546c-fe28-33c1-5f7a-fb71ba73249b"; Source = {Id = "093b66de-366d-40fc-a3b5-2c2d396d7fb5"; PortNumber = None; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Target = {Id = "f812e552-daab-73d0-cfa0-de0190279c8d"; PortNumber = None; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Vertices = [383.0,128.0; 432.0,128.0; 432.0,209.33333333333334; 481.0,209.33333333333334]}
|
||||
{Id = "18bf5873-fe65-59d4-9c42-4b578bac5dc6"; Source = {Id = "8cbfb956-5d53-aa0f-2546-ff32426901d1"; PortNumber = None; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Target = {Id = "f7ed4610-faf3-e0cb-d985-86f6da5fa148"; PortNumber = None; PortType = PortType.Input; HostId = "434a7ce9-942f-0939-94eb-8dd7162ad916"}; Vertices = [383.0,148.0; 567.0,148.0]}
|
||||
{Id = "026d76ef-92b3-91ae-6873-e2cc505ccb8d"; Source = {Id = "60b550b8-37d9-a0b8-c55c-cfc0044ef147"; PortNumber = None; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Target = {Id = "7cdb3ebb-cfa1-6892-9d35-de8f15cb87ac"; PortNumber = None; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Vertices = [247.0,240.0; 285.0,240.0; 285.0,148.0; 323.0,148.0]}
|
||||
{Id = "3c37db26-e552-d5fb-10f5-57227c4ec6f5"; Source = {Id = "93f988ff-3b92-1904-2dcb-17ec5e88178f"; PortNumber = None; PortType = PortType.Output; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Target = {Id = "17f9e9e2-3040-65ba-9578-b4ea6a8f8b28"; PortNumber = None; PortType = PortType.Input; HostId = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"}; Vertices = [521.0,216.0; 567.0,216.0]}
|
||||
{Id = "e1f27e7e-d0ae-e207-db0e-59c9a872255d"; Source = {Id = "042a92cb-f8d7-3cca-7519-a0bae85fdb6b"; PortNumber = None; PortType = PortType.Output; HostId = "eddfd0f6-f06d-5190-3af9-540371a13391"}; Target = {Id = "15575f10-2ec6-6033-cd3a-3ddabda8dbf3"; PortNumber = None; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Vertices = [130.0,80.0; 226.5,80.0; 226.5,128.0; 323.0,128.0]}
|
||||
]
|
||||
|
||||
let fullAdderDependency : LoadedComponent = {
|
||||
Name = "full-adder"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = fullAdderState
|
||||
InputLabels = ["Cin", 1; "B", 1; "A", 1]
|
||||
OutputLabels = ["Sum", 1; "Cout", 1]
|
||||
}
|
||||
|
||||
let fullAdderCustom : CustomComponentType =
|
||||
makeCustomComponent fullAdderDependency
|
||||
|
||||
// 2 bit adder: uses full adder.
|
||||
|
||||
let twoBitAdderState : CanvasState =
|
||||
[
|
||||
{ H=50; W=40; Id = "57604fee-25b0-9498-06f1-3a065d046515"; Type = Custom {Name = "full-adder"; InputLabels = ["Cin", 1; "B", 1; "A", 1]; OutputLabels = ["Sum", 1; "Cout", 1]}; Label = "full-adder"; InputPorts = [{Id = "6a5725f2-f181-d678-371f-7add822462ea"; PortNumber = Some 0; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "13f98ff8-2e41-2aef-cbc8-1ed636c8c8c7"; PortNumber = Some 1; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "025e36fe-41f2-7f7c-08e2-7b1bb047b798"; PortNumber = Some 2; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}]; OutputPorts = [{Id = "c14929a9-b56c-2414-38e6-6fab3127203f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "0cb60845-f6b7-4e88-53bc-18e6c06364ca"; PortNumber = Some 1; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}]; X = 298; Y = 129}
|
||||
{ H=50; W=40; Id = "b2842635-e4ec-3113-9130-d827d48e2875"; Type = Custom {Name = "full-adder"; InputLabels = ["Cin", 1; "B", 1; "A", 1]; OutputLabels = ["Sum", 1; "Cout", 1]}; Label = "full-adder"; InputPorts = [{Id = "ce42647b-a5db-5fa1-9a94-baaeec7416cd"; PortNumber = Some 0; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "3496a30f-e2bf-2b12-576d-cf28201850ff"; PortNumber = Some 1; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "9c0d3115-bf93-6c1c-b5bb-784cd7ca7896"; PortNumber = Some 2; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}]; OutputPorts = [{Id = "f6da6a43-076e-1171-53de-6bef710bcaf8"; PortNumber = Some 0; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "04744361-bbe8-ac74-8643-fae2126ed686"; PortNumber = Some 1; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}]; X = 298; Y = 298}
|
||||
{ H=50; W=40; Id = "78795182-35c4-1c50-2190-6fc944a2adea"; Type = Input 1; Label = "Zero"; InputPorts = []; OutputPorts = [{Id = "8b0b16ed-3a4e-2ade-6e4b-6285b0d7d2c8"; PortNumber = Some 0; PortType = PortType.Output; HostId = "78795182-35c4-1c50-2190-6fc944a2adea"}]; X = 155; Y = 72}
|
||||
{ H=50; W=40; Id = "69a6ad2a-af19-369f-0483-0e09e6841da3"; Type = Input 1; Label = "B0"; InputPorts = []; OutputPorts = [{Id = "0b74f567-0740-9667-a7e9-3042aeb7ef8f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "69a6ad2a-af19-369f-0483-0e09e6841da3"}]; X = 83; Y = 150}
|
||||
{ H=50; W=40; Id = "82a03f0b-ae31-b487-ed1b-335e235adeb7"; Type = Input 1; Label = "A1"; InputPorts = []; OutputPorts = [{Id = "e3b566b6-abf4-1446-7267-37d2ad1deed7"; PortNumber = Some 0; PortType = PortType.Output; HostId = "82a03f0b-ae31-b487-ed1b-335e235adeb7"}]; X = 84; Y = 389}
|
||||
{ H=50; W=40; Id = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"; Type = Input 1; Label = "B1"; InputPorts = []; OutputPorts = [{Id = "d59e003b-088b-cf84-0f93-83c2235b5942"; PortNumber = Some 0; PortType = PortType.Output; HostId = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"}]; X = 84; Y = 324}
|
||||
{ H=50; W=40; Id = "86372781-c2f4-09f2-406f-f385ee7a47a9"; Type = Input 1; Label = "A0"; InputPorts = []; OutputPorts = [{Id = "0d00e79c-1a98-3744-be2f-b9eb78a1cf5b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "86372781-c2f4-09f2-406f-f385ee7a47a9"}]; X = 83; Y = 200}
|
||||
{ H=50; W=40; Id = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"; Type = Output 1; Label = "Sum1"; InputPorts = [{Id = "8dcbc0d6-ab44-c2e2-9e26-90ee31fa2e35"; PortNumber = Some 0; PortType = PortType.Input; HostId = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"}]; OutputPorts = []; X = 514; Y = 321}
|
||||
{ H=50; W=40; Id = "8f5bded5-f46d-722d-6108-03dda4236c01"; Type = Output 1; Label = "Sum0"; InputPorts = [{Id = "3a537f37-4c6d-3c85-48a7-040d6263bebe"; PortNumber = Some 0; PortType = PortType.Input; HostId = "8f5bded5-f46d-722d-6108-03dda4236c01"}]; OutputPorts = []; X = 514; Y = 150}
|
||||
{ H=50; W=40; Id = "7d948312-376d-1d4b-cf02-90872026be16"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "bb868347-969a-38d2-2389-2d4ae7b63ce8"; PortNumber = Some 0; PortType = PortType.Input; HostId = "7d948312-376d-1d4b-cf02-90872026be16"}]; OutputPorts = []; X = 514; Y = 389}
|
||||
],
|
||||
[
|
||||
{Id = "9a089fef-870a-53d8-00a0-e954963ac8e1"; Source = {Id = "0cb60845-f6b7-4e88-53bc-18e6c06364ca"; PortNumber = None; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Target = {Id = "ce42647b-a5db-5fa1-9a94-baaeec7416cd"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [370.0,189.0; 399.0,189.0; 399.0,255.75; 278.0,255.75; 278.0,320.5; 298.0,320.5]}
|
||||
{Id = "77ab7f29-5375-44b2-d66f-b7c21d412c7f"; Source = {Id = "0b74f567-0740-9667-a7e9-3042aeb7ef8f"; PortNumber = None; PortType = PortType.Output; HostId = "69a6ad2a-af19-369f-0483-0e09e6841da3"}; Target = {Id = "13f98ff8-2e41-2aef-cbc8-1ed636c8c8c7"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [113.0,160.0; 214.5,160.0; 214.5,174.0; 298.0,174.0]}
|
||||
{Id = "dba98b52-cddf-04d3-648a-fa7b915d4f87"; Source = {Id = "d59e003b-088b-cf84-0f93-83c2235b5942"; PortNumber = None; PortType = PortType.Output; HostId = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"}; Target = {Id = "3496a30f-e2bf-2b12-576d-cf28201850ff"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [114.0,334.0; 215.0,334.0; 215.0,343.0; 298.0,343.0]}
|
||||
{Id = "c7ce0fcc-c122-4ce6-3779-0f548cbfab38"; Source = {Id = "f6da6a43-076e-1171-53de-6bef710bcaf8"; PortNumber = None; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Target = {Id = "8dcbc0d6-ab44-c2e2-9e26-90ee31fa2e35"; PortNumber = None; PortType = PortType.Input; HostId = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"}; Vertices = [370.0,328.0; 446.5,328.0; 446.5,331.0; 514.0,331.0]}
|
||||
{Id = "abc884ae-3a1a-5a35-6f6f-5695d4898759"; Source = {Id = "04744361-bbe8-ac74-8643-fae2126ed686"; PortNumber = None; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Target = {Id = "bb868347-969a-38d2-2389-2d4ae7b63ce8"; PortNumber = None; PortType = PortType.Input; HostId = "7d948312-376d-1d4b-cf02-90872026be16"}; Vertices = [370.0,358.0; 446.5,358.0; 446.5,399.0; 514.0,399.0]}
|
||||
{Id = "3c7b523c-71d3-9378-176c-7c45cfc516cf"; Source = {Id = "c14929a9-b56c-2414-38e6-6fab3127203f"; PortNumber = None; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Target = {Id = "3a537f37-4c6d-3c85-48a7-040d6263bebe"; PortNumber = None; PortType = PortType.Input; HostId = "8f5bded5-f46d-722d-6108-03dda4236c01"}; Vertices = [370.0,159.0; 446.5,159.0; 446.5,160.0; 514.0,160.0]}
|
||||
{Id = "ccb35ae8-54b6-4072-6680-3cc05bb00f95"; Source = {Id = "0d00e79c-1a98-3744-be2f-b9eb78a1cf5b"; PortNumber = None; PortType = PortType.Output; HostId = "86372781-c2f4-09f2-406f-f385ee7a47a9"}; Target = {Id = "025e36fe-41f2-7f7c-08e2-7b1bb047b798"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [113.0,210.0; 214.5,210.0; 214.5,196.5; 298.0,196.5]}
|
||||
{Id = "11759cef-e928-32c1-e6ec-b44b198d1a2e"; Source = {Id = "e3b566b6-abf4-1446-7267-37d2ad1deed7"; PortNumber = None; PortType = PortType.Output; HostId = "82a03f0b-ae31-b487-ed1b-335e235adeb7"}; Target = {Id = "9c0d3115-bf93-6c1c-b5bb-784cd7ca7896"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [114.0,399.0; 215.0,399.0; 215.0,365.5; 298.0,365.5]}
|
||||
{Id = "2ae1f296-5dfb-986e-2c4c-3e3435d750b9"; Source = {Id = "8b0b16ed-3a4e-2ade-6e4b-6285b0d7d2c8"; PortNumber = None; PortType = PortType.Output; HostId = "78795182-35c4-1c50-2190-6fc944a2adea"}; Target = {Id = "6a5725f2-f181-d678-371f-7add822462ea"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [185.0,82.0; 250.5,82.0; 250.5,151.5; 298.0,151.5]}
|
||||
]
|
||||
|
||||
let twoBitAdderDependency : LoadedComponent = {
|
||||
Name = "2-bit-adder"
|
||||
FilePath = ""
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
CanvasState = twoBitAdderState
|
||||
InputLabels = ["A0", 1; "B1", 1; "A1", 1; "B0", 1; "Zero", 1]
|
||||
OutputLabels = ["Cout", 1; "Sum0", 1; "Sum1", 1]
|
||||
}
|
||||
|
||||
let twoBitAdderCustom : CustomComponentType =
|
||||
makeCustomComponent twoBitAdderDependency
|
69
Tests/CanvasStatesMemories.fs
Normal file
|
@ -0,0 +1,69 @@
|
|||
module CanvasStatesMemories
|
||||
|
||||
open CommonTypes
|
||||
open Helpers
|
||||
|
||||
let makeData (lst: int list) =
|
||||
lst
|
||||
|> List.indexed
|
||||
|> List.map (fun (a,d) -> int64 a, int64 d)
|
||||
|> Map
|
||||
|
||||
let mem1 = {
|
||||
AddressWidth = 2
|
||||
WordWidth = 4
|
||||
Data = [0; 1; 4; 15] |> makeData
|
||||
}
|
||||
|
||||
/// Synchronous ROM connected to address and output.
|
||||
let stateMem1 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "322715aa-a1d4-b314-91c7-670d33bca00a";Type = ROM mem1;Label = "";InputPorts = [{Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = Some 0;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];OutputPorts = [{Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = Some 0;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];X = 252;Y = 240};
|
||||
{H=50;W=40; Id = "4f65afe9-f03c-2b97-fde9-c657ca32f246";Type = Input 2;Label = "addr";InputPorts = [];OutputPorts = [{Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"}];X = 88;Y = 280};
|
||||
{H=50;W=40; Id = "fbb5aa79-a471-ac24-4201-56ae39d537c6";Type = Output 4;Label = "data";InputPorts = [{Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"}];OutputPorts = [];X = 467;Y = 280}
|
||||
],
|
||||
[
|
||||
{Id = "b5675376-6921-1909-5838-b43891f88fee";Source = {Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = None;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"};Target = {Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = None;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Vertices = [118.0,290.0; 252.0,290.0]};
|
||||
{Id = "4720848e-5a2e-7203-d4ac-22f9d9d74af3";Source = {Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = None;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Target = {Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = None;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"};Vertices = [332.0,290.0; 467.0,290.0]}
|
||||
]
|
||||
|
||||
/// Numbers from 0 to 255.
|
||||
let mem2 = {
|
||||
AddressWidth = 8
|
||||
WordWidth = 8
|
||||
Data = [0..pow2(8)-1] |> makeData
|
||||
}
|
||||
|
||||
/// Synchronous ROM connected to address and output. ROM is big.
|
||||
let stateMem2 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "322715aa-a1d4-b314-91c7-670d33bca00a";Type = ROM mem2;Label = "";InputPorts = [{Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = Some 0;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];OutputPorts = [{Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = Some 0;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];X = 252;Y = 240};
|
||||
{H=50;W=40; Id = "4f65afe9-f03c-2b97-fde9-c657ca32f246";Type = Input 8;Label = "addr";InputPorts = [];OutputPorts = [{Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"}];X = 88;Y = 280};
|
||||
{H=50;W=40; Id = "fbb5aa79-a471-ac24-4201-56ae39d537c6";Type = Output 8;Label = "data";InputPorts = [{Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"}];OutputPorts = [];X = 467;Y = 280}
|
||||
],
|
||||
[
|
||||
{Id = "b5675376-6921-1909-5838-b43891f88fee";Source = {Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = None;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"};Target = {Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = None;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Vertices = [118.0,290.0; 252.0,290.0]};
|
||||
{Id = "4720848e-5a2e-7203-d4ac-22f9d9d74af3";Source = {Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = None;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Target = {Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = None;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"};Vertices = [332.0,290.0; 467.0,290.0]}
|
||||
]
|
||||
|
||||
let mem3 = {
|
||||
AddressWidth = 3
|
||||
WordWidth = 4
|
||||
Data = [0; 0; 0; 0; 0; 0; 0; 0] |> makeData
|
||||
}
|
||||
|
||||
/// Fully connected RAM.
|
||||
let stateMem3 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60";Type = RAM mem3;Label = "";InputPorts = [{Id = "83ff4d8a-a28e-ebc8-8311-77def91ca935";PortNumber = Some 0;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}; {Id = "0c116a9b-78cd-79a5-c080-dfdc1445334d";PortNumber = Some 1;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}; {Id = "86e5f7cf-657c-9383-54b3-65c156fdf867";PortNumber = Some 2;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}];OutputPorts = [{Id = "c9e983ab-b832-156a-36fd-9ce1d03810d7";PortNumber = Some 0;PortType = PortType.Output;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}];X = 318;Y = 190};
|
||||
{H=50;W=40; Id = "1f9704f9-88fc-124c-3ff8-21c36cfb7328";Type = Output 4;Label = "data-out";InputPorts = [{Id = "0af79035-101f-b683-f39c-68a36a7dc33f";PortNumber = Some 0;PortType = PortType.Input;HostId = "1f9704f9-88fc-124c-3ff8-21c36cfb7328"}];OutputPorts = [];X = 647;Y = 230};
|
||||
{H=50;W=40; Id = "266d8763-6fbf-37c2-6825-d3487153053b";Type = Input 4;Label = "data-in";InputPorts = [];OutputPorts = [{Id = "b155889c-3d6d-8ebf-2b3b-771f1ada3578";PortNumber = Some 0;PortType = PortType.Output;HostId = "266d8763-6fbf-37c2-6825-d3487153053b"}];X = 116;Y = 230};
|
||||
{H=50;W=40; Id = "81030fc6-2471-a568-160f-922709edeb2e";Type = Input 3;Label = "addr";InputPorts = [];OutputPorts = [{Id = "ceb4382f-d670-912f-87c2-755315a89c87";PortNumber = Some 0;PortType = PortType.Output;HostId = "81030fc6-2471-a568-160f-922709edeb2e"}];X = 116;Y = 138};
|
||||
{H=50;W=40; Id = "f0769200-24e3-5c7b-3591-c5c3711d9336";Type = Input 1;Label = "write";InputPorts = [];OutputPorts = [{Id = "b8286beb-9cc1-1128-cc1e-813388ca16fc";PortNumber = Some 0;PortType = PortType.Output;HostId = "f0769200-24e3-5c7b-3591-c5c3711d9336"}];X = 116;Y = 322}
|
||||
],
|
||||
[
|
||||
{Id = "04957b14-81b7-83c0-7669-c9c6fc363e00";Source = {Id = "b155889c-3d6d-8ebf-2b3b-771f1ada3578";PortNumber = None;PortType = PortType.Output;HostId = "266d8763-6fbf-37c2-6825-d3487153053b"};Target = {Id = "0c116a9b-78cd-79a5-c080-dfdc1445334d";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,240.0; 318.0,240.0]};
|
||||
{Id = "d24c03fd-7b01-e68f-0d6f-8ff153791809";Source = {Id = "c9e983ab-b832-156a-36fd-9ce1d03810d7";PortNumber = None;PortType = PortType.Output;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Target = {Id = "0af79035-101f-b683-f39c-68a36a7dc33f";PortNumber = None;PortType = PortType.Input;HostId = "1f9704f9-88fc-124c-3ff8-21c36cfb7328"};Vertices = [448.0,240.0; 647.0,240.0]};
|
||||
{Id = "63851c98-6945-0718-29c9-94f738246fd3";Source = {Id = "b8286beb-9cc1-1128-cc1e-813388ca16fc";PortNumber = None;PortType = PortType.Output;HostId = "f0769200-24e3-5c7b-3591-c5c3711d9336"};Target = {Id = "86e5f7cf-657c-9383-54b3-65c156fdf867";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,332.0; 232.0,332.0; 232.0,265.0; 318.0,265.0]};
|
||||
{Id = "69b302c0-11e5-bb4d-291c-077318321d91";Source = {Id = "ceb4382f-d670-912f-87c2-755315a89c87";PortNumber = None;PortType = PortType.Output;HostId = "81030fc6-2471-a568-160f-922709edeb2e"};Target = {Id = "83ff4d8a-a28e-ebc8-8311-77def91ca935";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,148.0; 232.0,148.0; 232.0,215.0; 318.0,215.0]}
|
||||
]
|
233
Tests/CanvasStatesSync.fs
Normal file
|
@ -0,0 +1,233 @@
|
|||
module CanvasStatesSync
|
||||
|
||||
open CommonTypes
|
||||
|
||||
/// Simple DFF connected to an input and an output.
|
||||
let stateSync1 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 409;Y = 232};
|
||||
{H=50; W=40;Id = "6e7a2000-439c-108e-df6d-93cff7a41266";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "62496e2e-fa0d-3e2b-46f2-9ee99a141de6";PortNumber = Some 0;PortType = PortType.Output;HostId = "6e7a2000-439c-108e-df6d-93cff7a41266"}];X = 171;Y = 247};
|
||||
{H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 671;Y = 247}
|
||||
],
|
||||
[
|
||||
{Id = "fe93a564-b9be-2ce5-61a0-89a57d1f4c30";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [459.0,257.0; 671.0,257.0]};
|
||||
{Id = "e1da6926-1493-ffb0-c85b-c58b00506cd6";Source = {Id = "62496e2e-fa0d-3e2b-46f2-9ee99a141de6";PortNumber = None;PortType = PortType.Output;HostId = "6e7a2000-439c-108e-df6d-93cff7a41266"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [201.0,257.0; 409.0,257.0]}
|
||||
]
|
||||
|
||||
/// stateSync1 loaded as a dependency.
|
||||
let stateSync1Dependency : LoadedComponent = {
|
||||
Name = "single-dff"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = stateSync1
|
||||
InputLabels = ["in", 1]
|
||||
OutputLabels = ["out", 1]
|
||||
}
|
||||
|
||||
/// stateSync1 custom component.
|
||||
let stateSync1CustomComponent : CustomComponentType =
|
||||
CanvasStates.makeCustomComponent stateSync1Dependency
|
||||
|
||||
/// Two DFF connected in series.
|
||||
let stateSync2 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 351;Y = 185};
|
||||
{H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 752;Y = 200};
|
||||
{H=50; W=40;Id = "3739e54a-fd21-bf60-8fc2-a3d10108c947";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = Some 0;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"}];X = 200;Y = 200};
|
||||
{H=50; W=40;Id = "edda6ee1-8b6f-8f37-8177-4c073299a362";Type = DFF;Label = "";InputPorts = [{Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = Some 0;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];OutputPorts = [{Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = Some 0;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];X = 574;Y = 185}
|
||||
],
|
||||
[
|
||||
{Id = "9e2ded72-08fd-c5d2-5bd7-f191c02f0d4d";Source = {Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = None;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [624.0,210.0; 752.0,210.0]};
|
||||
{Id = "bc1e6ca7-6f71-697d-c81e-53598fcd5b4e";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = None;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Vertices = [401.0,210.0; 574.0,210.0]};
|
||||
{Id = "9b5af8de-2de5-3a95-7347-316c3f9cfa8d";Source = {Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = None;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [230.0,210.0; 351.0,210.0]}
|
||||
]
|
||||
|
||||
/// Three DFF connected in series.
|
||||
let stateSync3 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 351;Y = 185};
|
||||
{H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 752;Y = 200};
|
||||
{H=50; W=40;Id = "3739e54a-fd21-bf60-8fc2-a3d10108c947";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = Some 0;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"}];X = 200;Y = 200};
|
||||
{H=50; W=40;Id = "edda6ee1-8b6f-8f37-8177-4c073299a362";Type = DFF;Label = "";InputPorts = [{Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = Some 0;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];OutputPorts = [{Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = Some 0;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];X = 489;Y = 185};
|
||||
{H=50; W=40;Id = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650";Type = DFF;Label = "";InputPorts = [{Id = "2e1f0297-f4c6-c266-7dbb-d56fc63e386a";PortNumber = Some 0;PortType = PortType.Input;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"}];OutputPorts = [{Id = "e0df158f-e186-c205-8693-9fa92c62d154";PortNumber = Some 0;PortType = PortType.Output;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"}];X = 613;Y = 185}
|
||||
],
|
||||
[
|
||||
{Id = "9e2ded72-08fd-c5d2-5bd7-f191c02f0d4d";Source = {Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = None;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Target = {Id = "2e1f0297-f4c6-c266-7dbb-d56fc63e386a";PortNumber = None;PortType = PortType.Input;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"};Vertices = [539.0,210.0; 613.0,210.0]};
|
||||
{Id = "9b5af8de-2de5-3a95-7347-316c3f9cfa8d";Source = {Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = None;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [230.0,210.0; 351.0,210.0]};
|
||||
{Id = "bc1e6ca7-6f71-697d-c81e-53598fcd5b4e";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = None;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Vertices = [401.0,210.0; 489.0,210.0]};
|
||||
{Id = "56b29fa5-a6e0-45d1-d2c0-4d3f4d82d94c";Source = {Id = "e0df158f-e186-c205-8693-9fa92c62d154";PortNumber = None;PortType = PortType.Output;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [663.0,210.0; 752.0,210.0]}
|
||||
]
|
||||
|
||||
/// StateSync1 custom component followed by a DFF.
|
||||
let stateSync4 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "03e4c81a-4703-d9f5-dfaf-301de006610f";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "0caf419c-354b-78b8-a12b-e5fa450d4fc0";PortNumber = Some 0;PortType = PortType.Output;HostId = "03e4c81a-4703-d9f5-dfaf-301de006610f"}];X = 100;Y = 100};
|
||||
{H=50; W=40;Id = "781e7d9d-b18c-d614-dbc0-23bac9e617b7";Type = Output 1;Label = "b";InputPorts = [{Id = "a8e8da74-7bd2-f3a8-9ee5-9e8caa1ee0e5";PortNumber = Some 0;PortType = PortType.Input;HostId = "781e7d9d-b18c-d614-dbc0-23bac9e617b7"}];OutputPorts = [];X = 749;Y = 100};
|
||||
{H=50; W=40;Id = "547051c6-38f6-27ec-7c33-9c3bbee47e6e";Type = DFF;Label = "";InputPorts = [{Id = "7ec9e434-b066-daf3-3308-0a13a97c8880";PortNumber = Some 0;PortType = PortType.Input;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"}];OutputPorts = [{Id = "252c237c-1323-a291-eccb-f94392a37743";PortNumber = Some 0;PortType = PortType.Output;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"}];X = 500;Y = 85};
|
||||
{H=50; W=40;Id = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b";Type = Custom stateSync1CustomComponent;Label = "main";InputPorts = [{Id = "4c5a5a1a-e7e3-f53b-8059-0dfd34d796b1";PortNumber = Some 0;PortType = PortType.Input;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"}];OutputPorts = [{Id = "05578981-7a96-a101-b726-df761e234abb";PortNumber = Some 0;PortType = PortType.Output;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"}];X = 285;Y = 95}
|
||||
],
|
||||
[
|
||||
{Id = "75474538-c7cb-de96-9fd2-5f55af7af631";Source = {Id = "0caf419c-354b-78b8-a12b-e5fa450d4fc0";PortNumber = None;PortType = PortType.Output;HostId = "03e4c81a-4703-d9f5-dfaf-301de006610f"};Target = {Id = "4c5a5a1a-e7e3-f53b-8059-0dfd34d796b1";PortNumber = None;PortType = PortType.Input;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"};Vertices = [130.0,110.0; 285.0,110.0]};
|
||||
{Id = "4c146e97-db61-4848-5073-01c3785d2571";Source = {Id = "252c237c-1323-a291-eccb-f94392a37743";PortNumber = None;PortType = PortType.Output;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"};Target = {Id = "a8e8da74-7bd2-f3a8-9ee5-9e8caa1ee0e5";PortNumber = None;PortType = PortType.Input;HostId = "781e7d9d-b18c-d614-dbc0-23bac9e617b7"};Vertices = [550.0,110.0; 749.0,110.0]};
|
||||
{Id = "50982a96-2ea6-7db7-2eda-6c38456697c4";Source = {Id = "05578981-7a96-a101-b726-df761e234abb";PortNumber = None;PortType = PortType.Output;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"};Target = {Id = "7ec9e434-b066-daf3-3308-0a13a97c8880";PortNumber = None;PortType = PortType.Input;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"};Vertices = [345.0,110.0; 500.0,110.0]}
|
||||
]
|
||||
|
||||
/// A DFF looping to itself via a Not gate. Two output nodes to probe the wires
|
||||
/// before and after the Not gate. No inputs.
|
||||
let stateSync5 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "62a3108e-1198-502b-e338-e677815aead3";Type = Output 1;Label = "out1";InputPorts = [{Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = Some 0;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"}];OutputPorts = [];X = 417;Y = 117};
|
||||
{H=50; W=40;Id = "fc72c05a-5174-0334-aa74-be3ce27c3657";Type = Not;Label = "";InputPorts = [{Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = Some 0;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];OutputPorts = [{Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = Some 0;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];X = 169;Y = 184};
|
||||
{H=50; W=40;Id = "023094a0-9787-47ce-26af-03086cdc4b15";Type = Output 1;Label = "out2";InputPorts = [{Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = Some 0;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"}];OutputPorts = [];X = 229;Y = 138};
|
||||
{H=50; W=40;Id = "1a772449-853d-2171-1e47-fb9783b99556";Type = DFF;Label = "";InputPorts = [{Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];OutputPorts = [{Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = Some 0;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];X = 273;Y = 343}
|
||||
],
|
||||
[
|
||||
{Id = "5f42f1e8-0ccd-24e1-04a2-635d957c991b";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = None;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"};Vertices = [199.0,199.0; 214.0,199.0; 214.0,148.0; 229.0,148.0]};
|
||||
{Id = "dc4cbb8e-e7a8-a008-97a8-0200f8720a81";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = None;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Vertices = [199.0,199.0; 236.0,199.0; 236.0,368.0; 273.0,368.0]};
|
||||
{Id = "4810ec6b-a9f9-a562-58cf-82f9071755ad";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = None;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Vertices = [323.0,368.0; 343.0,368.0; 343.0,283.5; 149.0,283.5; 149.0,199.0; 169.0,199.0]};
|
||||
{Id = "3831ffa7-549f-da3b-ab73-20c72e69b5b8";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = None;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"};Vertices = [323.0,368.0; 370.0,368.0; 370.0,127.0; 417.0,127.0]}
|
||||
]
|
||||
|
||||
|
||||
/// Similar to stateSync5, but with a stateSync1 custom component instead of a
|
||||
/// DFF. Loop with a synchronous custom component.
|
||||
let stateSync6 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "62a3108e-1198-502b-e338-e677815aead3";Type = Output 1;Label = "out1";InputPorts = [{Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = Some 0;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"}];OutputPorts = [];X = 417;Y = 117};
|
||||
{H=50; W=40;Id = "fc72c05a-5174-0334-aa74-be3ce27c3657";Type = Not;Label = "";InputPorts = [{Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = Some 0;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];OutputPorts = [{Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = Some 0;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];X = 169;Y = 184};
|
||||
{H=50; W=40;Id = "023094a0-9787-47ce-26af-03086cdc4b15";Type = Output 1;Label = "out2";InputPorts = [{Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = Some 0;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"}];OutputPorts = [];X = 229;Y = 138};
|
||||
{H=50; W=40;Id = "1a772449-853d-2171-1e47-fb9783b99556";Type = Custom stateSync1CustomComponent;Label = "";InputPorts = [{Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];OutputPorts = [{Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = Some 0;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];X = 273;Y = 343}
|
||||
],
|
||||
[
|
||||
{Id = "5f42f1e8-0ccd-24e1-04a2-635d957c991b";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = None;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"};Vertices = [199.0,199.0; 214.0,199.0; 214.0,148.0; 229.0,148.0]};
|
||||
{Id = "dc4cbb8e-e7a8-a008-97a8-0200f8720a81";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = None;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Vertices = [199.0,199.0; 236.0,199.0; 236.0,368.0; 273.0,368.0]};
|
||||
{Id = "4810ec6b-a9f9-a562-58cf-82f9071755ad";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = None;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Vertices = [323.0,368.0; 343.0,368.0; 343.0,283.5; 149.0,283.5; 149.0,199.0; 169.0,199.0]};
|
||||
{Id = "3831ffa7-549f-da3b-ab73-20c72e69b5b8";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = None;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"};Vertices = [323.0,368.0; 370.0,368.0; 370.0,127.0; 417.0,127.0]}
|
||||
]
|
||||
|
||||
/// Input connected to two outputs. One of the two paths has a DFF in between.
|
||||
/// Therefore, A to B-Comb is combinatorial path. A to B-Sync is a synchronous
|
||||
/// path.
|
||||
let stateSync7 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "ff10125a-601f-e1d5-e379-7eb7c65eb91f";Type = Input 1;Label = "A";InputPorts = [];OutputPorts = [{Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = Some 0;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"}];X = 150;Y = 150};
|
||||
{H=50; W=40;Id = "2947473e-2eef-864c-217a-dd5c1daaae44";Type = DFF;Label = "";InputPorts = [{Id = "45a6e6f6-ed52-8de9-2fed-9f7a0bbb86dc";PortNumber = Some 0;PortType = PortType.Input;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"}];OutputPorts = [{Id = "25dc0c5b-e047-090b-5c2a-7ac216d80122";PortNumber = Some 0;PortType = PortType.Output;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"}];X = 230;Y = 210};
|
||||
{H=50; W=40;Id = "794d5154-6969-3f4e-9c8b-4bc17927c28f";Type = Output 1;Label = "B-Comb";InputPorts = [{Id = "dbdd44c2-14e4-449c-4d69-6dd78af61e2c";PortNumber = Some 0;PortType = PortType.Input;HostId = "794d5154-6969-3f4e-9c8b-4bc17927c28f"}];OutputPorts = [];X = 328;Y = 150};
|
||||
{H=50; W=40;Id = "95452292-b507-ab43-f082-85152d3e4cf2";Type = Output 1;Label = "B-Sync";InputPorts = [{Id = "05a19e53-570c-f02f-0af2-7ba35c4a4b71";PortNumber = Some 0;PortType = PortType.Input;HostId = "95452292-b507-ab43-f082-85152d3e4cf2"}];OutputPorts = [];X = 328;Y = 225}
|
||||
],
|
||||
[
|
||||
{Id = "79418b3f-7ee3-997a-a433-32a9fbb49f18";Source = {Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = None;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"};Target = {Id = "dbdd44c2-14e4-449c-4d69-6dd78af61e2c";PortNumber = None;PortType = PortType.Input;HostId = "794d5154-6969-3f4e-9c8b-4bc17927c28f"};Vertices = [180.0,160.0; 328.0,160.0]};
|
||||
{Id = "51efab13-f633-205b-8cd4-c3c858ae25d8";Source = {Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = None;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"};Target = {Id = "45a6e6f6-ed52-8de9-2fed-9f7a0bbb86dc";PortNumber = None;PortType = PortType.Input;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"};Vertices = [180.0,160.0; 205.0,160.0; 205.0,235.0; 230.0,235.0]};
|
||||
{Id = "10c6a066-34dd-e0e2-d53d-32c34fcddde6";Source = {Id = "25dc0c5b-e047-090b-5c2a-7ac216d80122";PortNumber = None;PortType = PortType.Output;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"};Target = {Id = "05a19e53-570c-f02f-0af2-7ba35c4a4b71";PortNumber = None;PortType = PortType.Input;HostId = "95452292-b507-ab43-f082-85152d3e4cf2"};Vertices = [280.0,235.0; 328.0,235.0]}
|
||||
]
|
||||
|
||||
/// stateSync7 loaded as a dependency.
|
||||
let stateSync7Dependency : LoadedComponent = {
|
||||
Name = "combinatorial-sync"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = stateSync7
|
||||
InputLabels = ["A", 1]
|
||||
OutputLabels = ["B-Comb", 1; "B-Sync", 1]
|
||||
}
|
||||
|
||||
/// stateSync7 custom component.
|
||||
let stateSync7CustomComponent : CustomComponentType =
|
||||
CanvasStates.makeCustomComponent stateSync7Dependency
|
||||
|
||||
/// stateSync7 Not-ed self looped in the synchronous branch. This is a
|
||||
/// legitimate synchronous circuit and should pass. It is the same showed in
|
||||
/// the report for the examples about combinatorial loops detection.
|
||||
let stateSync8 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "eb5353fd-fac6-3b2a-4de8-8949046671d2";Type = Custom stateSync7CustomComponent;Label = "";InputPorts = [{Id = "04f9c8fe-06c2-b485-e181-73aa36617622";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}];OutputPorts = [{Id = "b9f547be-e285-cb90-1803-b8d3a4c0d351";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}; {Id = "9935af7b-9671-60a2-a76a-f00d3a372d6c";PortNumber = Some 1;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}];X = 302;Y = 256};
|
||||
{H=50; W=40;Id = "66030e1a-4a97-244a-f0bb-d9e5fd25627f";Type = Output 1;Label = "B";InputPorts = [{Id = "8bfcfe42-be19-e2fa-42ae-25e929cab003";PortNumber = Some 0;PortType = PortType.Input;HostId = "66030e1a-4a97-244a-f0bb-d9e5fd25627f"}];OutputPorts = [];X = 488;Y = 266};
|
||||
{H=50; W=40;Id = "825b172a-9355-8bf1-10fc-b18f06d4e76b";Type = Not;Label = "";InputPorts = [{Id = "69688e66-1a74-e959-f58a-6085a5ae5c57";PortNumber = Some 0;PortType = PortType.Input;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"}];OutputPorts = [{Id = "7f763373-0473-16b8-75da-f80541b220ec";PortNumber = Some 0;PortType = PortType.Output;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"}];X = 536;Y = 281}
|
||||
],
|
||||
[
|
||||
{Id = "c1ba620c-e715-5f47-d05b-1a6937750f13";Source = {Id = "7f763373-0473-16b8-75da-f80541b220ec";PortNumber = None;PortType = PortType.Output;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"};Target = {Id = "04f9c8fe-06c2-b485-e181-73aa36617622";PortNumber = None;PortType = PortType.Input;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Vertices = [566.0,296.0; 586.0,296.0; 586.0,395.0; 282.0,395.0; 282.0,286.0; 302.0,286.0]};
|
||||
{Id = "b1a62f29-11d6-957d-da22-f780a247ad24";Source = {Id = "9935af7b-9671-60a2-a76a-f00d3a372d6c";PortNumber = None;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Target = {Id = "69688e66-1a74-e959-f58a-6085a5ae5c57";PortNumber = None;PortType = PortType.Input;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"};Vertices = [374.0,296.0; 536.0,296.0]};
|
||||
{Id = "ee6ffc42-4a79-edff-3eb2-7008eec7a649";Source = {Id = "b9f547be-e285-cb90-1803-b8d3a4c0d351";PortNumber = None;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Target = {Id = "8bfcfe42-be19-e2fa-42ae-25e929cab003";PortNumber = None;PortType = PortType.Input;HostId = "66030e1a-4a97-244a-f0bb-d9e5fd25627f"};Vertices = [374.0,276.0; 488.0,276.0]}
|
||||
]
|
||||
|
||||
/// stateSync8 loaded as a dependency.
|
||||
let stateSync8Dependency : LoadedComponent = {
|
||||
Name = "fake-combinatorial-loop"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = stateSync8
|
||||
InputLabels = []
|
||||
OutputLabels = ["B", 1;]
|
||||
}
|
||||
|
||||
/// stateSync8 custom component.
|
||||
let stateSync8CustomComponent : CustomComponentType =
|
||||
CanvasStates.makeCustomComponent stateSync8Dependency
|
||||
|
||||
/// StateSync8 connected to an output. Legitmate ciruit that behaves precisely
|
||||
/// like stateSync8.
|
||||
let stateSync9 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "16e7b03d-6504-a148-e207-ce99634ee5c5";Type = Custom stateSync8CustomComponent;Label = "loop2";InputPorts = [];OutputPorts = [{Id = "1db2fde2-c823-9ac8-1b7f-5187166934e9";PortNumber = Some 0;PortType = PortType.Output;HostId = "16e7b03d-6504-a148-e207-ce99634ee5c5"}];X = 568;Y = 310};
|
||||
{H=50; W=40;Id = "a100bada-b27f-15ca-accb-153e717a31f1";Type = Output 1;Label = "B";InputPorts = [{Id = "b2c8d4ef-bb50-3b2b-259b-e6381ca798a4";PortNumber = Some 0;PortType = PortType.Input;HostId = "a100bada-b27f-15ca-accb-153e717a31f1"}];OutputPorts = [];X = 715;Y = 315}
|
||||
],
|
||||
[
|
||||
{Id = "2b617de7-dfcc-0287-1d9e-0f6a3b40de5b";Source = {Id = "1db2fde2-c823-9ac8-1b7f-5187166934e9";PortNumber = None;PortType = PortType.Output;HostId = "16e7b03d-6504-a148-e207-ce99634ee5c5"};Target = {Id = "b2c8d4ef-bb50-3b2b-259b-e6381ca798a4";PortNumber = None;PortType = PortType.Input;HostId = "a100bada-b27f-15ca-accb-153e717a31f1"};Vertices = [618.0,325.0; 715.0,325.0]}
|
||||
]
|
||||
|
||||
/// A fully connected DFFE.
|
||||
let stateSync10 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "5916f1cf-408e-4186-a839-c80926bfddf0";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "e894fb40-804a-36d1-b2e8-6033afb61dfa";PortNumber = Some 0;PortType = PortType.Output;HostId = "5916f1cf-408e-4186-a839-c80926bfddf0"}];X = 109;Y = 95};
|
||||
{H=50; W=40;Id = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf";Type = DFFE;Label = "";InputPorts = [{Id = "c766cb8d-a762-04b9-f021-4a9175fdbc01";PortNumber = Some 0;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}; {Id = "2b80cebe-c0af-4905-d443-fd99796ec8df";PortNumber = Some 1;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}];OutputPorts = [{Id = "ecee9ad7-925f-c0b9-26d5-4cf8b96a9be1";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}];X = 273;Y = 80};
|
||||
{H=50; W=40;Id = "cab54371-5e07-9586-eb9b-be8cc417e610";Type = Input 1;Label = "en";InputPorts = [];OutputPorts = [{Id = "4c83ef6d-7267-2732-d828-c508fff7f889";PortNumber = Some 0;PortType = PortType.Output;HostId = "cab54371-5e07-9586-eb9b-be8cc417e610"}];X = 109;Y = 270};
|
||||
{H=50; W=40;Id = "a2c874bb-eaeb-d62d-8a72-5eeae48db694";Type = Output 1;Label = "out";InputPorts = [{Id = "df5f625f-43c4-28bb-c931-eae047edaa14";PortNumber = Some 0;PortType = PortType.Input;HostId = "a2c874bb-eaeb-d62d-8a72-5eeae48db694"}];OutputPorts = [];X = 495;Y = 95}
|
||||
],
|
||||
[
|
||||
{Id = "7ab86f0a-1b2c-7901-0a12-cbe447f1f06d";Source = {Id = "e894fb40-804a-36d1-b2e8-6033afb61dfa";PortNumber = None;PortType = PortType.Output;HostId = "5916f1cf-408e-4186-a839-c80926bfddf0"};Target = {Id = "c766cb8d-a762-04b9-f021-4a9175fdbc01";PortNumber = None;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Vertices = [139.0,105.0; 273.0,105.0]};
|
||||
{Id = "04bb7d64-1899-a4f3-6c50-f53ccd84cd49";Source = {Id = "ecee9ad7-925f-c0b9-26d5-4cf8b96a9be1";PortNumber = None;PortType = PortType.Output;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Target = {Id = "df5f625f-43c4-28bb-c931-eae047edaa14";PortNumber = None;PortType = PortType.Input;HostId = "a2c874bb-eaeb-d62d-8a72-5eeae48db694"};Vertices = [353.0,105.0; 495.0,105.0]};
|
||||
{Id = "de4f03d1-580c-eabb-7439-38b664b89aba";Source = {Id = "4c83ef6d-7267-2732-d828-c508fff7f889";PortNumber = None;PortType = PortType.Output;HostId = "cab54371-5e07-9586-eb9b-be8cc417e610"};Target = {Id = "2b80cebe-c0af-4905-d443-fd99796ec8df";PortNumber = None;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Vertices = [139.0,280.938; 313.0,280.938; 313.0,130.0]}
|
||||
]
|
||||
|
||||
/// stateSync7 Not-ed self looped in the combinatorial branch. This is NOT a
|
||||
/// legitimate circuit, has combinatorial cycle. Similar to stateSync8 but loops
|
||||
/// with the other output of the custom component.
|
||||
let stateSync11 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "c9d9659a-4476-de3a-a838-eeab15496c99";Type = Custom stateSync7CustomComponent;Label = "loop1";InputPorts = [{Id = "c52782db-1ac3-f0d5-28ca-02c8410eb78d";PortNumber = Some 0;PortType = PortType.Input;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}];OutputPorts = [{Id = "eda8e4f2-f21b-12fc-b209-ad315b99a851";PortNumber = Some 0;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}; {Id = "627b5ddf-e4ef-5629-70d4-af674cf37b96";PortNumber = Some 1;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}];X = 508;Y = 245};
|
||||
{H=50; W=40;Id = "5c24921a-88e9-7bc2-ee89-97fefb694902";Type = Not;Label = "";InputPorts = [{Id = "e16cf7e3-d01f-29e5-8d0d-921194f2f909";PortNumber = Some 0;PortType = PortType.Input;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"}];OutputPorts = [{Id = "50f7aed7-49de-5472-defa-cbf07c2c4f56";PortNumber = Some 0;PortType = PortType.Output;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"}];X = 664;Y = 245};
|
||||
{H=50; W=40;Id = "68bfdbd5-b91f-9f34-0a32-2f8730856d49";Type = Output 1;Label = "B-Sync";InputPorts = [{Id = "ce17f39f-f79e-d9c5-78dd-379d4be0d3a4";PortNumber = Some 0;PortType = PortType.Input;HostId = "68bfdbd5-b91f-9f34-0a32-2f8730856d49"}];OutputPorts = [];X = 701;Y = 273}
|
||||
],
|
||||
[
|
||||
{Id = "24e0a9c6-5a3a-e5e9-5034-0f831dcbe0f9";Source = {Id = "627b5ddf-e4ef-5629-70d4-af674cf37b96";PortNumber = None;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Target = {Id = "ce17f39f-f79e-d9c5-78dd-379d4be0d3a4";PortNumber = None;PortType = PortType.Input;HostId = "68bfdbd5-b91f-9f34-0a32-2f8730856d49"};Vertices = [580.0,285.0; 640.5,285.0; 640.5,283.0; 701.0,283.0]};
|
||||
{Id = "bc1f9a51-5ca8-1aa0-b4bd-b86bc9646c20";Source = {Id = "eda8e4f2-f21b-12fc-b209-ad315b99a851";PortNumber = None;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Target = {Id = "e16cf7e3-d01f-29e5-8d0d-921194f2f909";PortNumber = None;PortType = PortType.Input;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"};Vertices = [580.0,265.0; 622.0,265.0; 622.0,260.0; 664.0,260.0]};
|
||||
{Id = "cc7a9da2-f78a-f3e1-1c2f-7323f2b43d15";Source = {Id = "50f7aed7-49de-5472-defa-cbf07c2c4f56";PortNumber = None;PortType = PortType.Output;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"};Target = {Id = "c52782db-1ac3-f0d5-28ca-02c8410eb78d";PortNumber = None;PortType = PortType.Input;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Vertices = [694.0,260.0; 714.0,260.0; 714.0,195.5; 488.0,195.5; 488.0,275.0; 508.0,275.0]}
|
||||
]
|
||||
|
||||
/// stateSync11 loaded as a dependency.
|
||||
let stateSync11Dependency : LoadedComponent = {
|
||||
Name = "combinatorial-loop"
|
||||
TimeStamp = System.DateTime.MinValue
|
||||
WaveInfo = None
|
||||
FilePath = ""
|
||||
CanvasState = stateSync11
|
||||
InputLabels = []
|
||||
OutputLabels = ["B-Sync", 1;]
|
||||
}
|
||||
|
||||
/// stateSync11 custom component.
|
||||
let stateSync11CustomComponent : CustomComponentType =
|
||||
CanvasStates.makeCustomComponent stateSync11Dependency
|
||||
|
||||
/// StateSync11 connected to an output. Should spot cycle in the dependency.
|
||||
let stateSync12 : CanvasState =
|
||||
[
|
||||
{H=50; W=40;Id = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f";Type = Custom stateSync11CustomComponent;Label = "loop2-comb";InputPorts = [];OutputPorts = [{Id = "685a78e3-c891-d0c3-f973-1814b01edd28";PortNumber = Some 0;PortType = PortType.Output;HostId = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f"}];X = 354;Y = 215};
|
||||
{H=50; W=40;Id = "638304a8-99e8-fe4f-4503-b50c64f45756";Type = Output 1;Label = "B-Comb";InputPorts = [{Id = "3b0171fa-dffe-f4c5-5f8c-e365112bae2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "638304a8-99e8-fe4f-4503-b50c64f45756"}];OutputPorts = [];X = 532;Y = 220}
|
||||
],
|
||||
[
|
||||
{Id = "f7c55a63-955e-6edd-0db6-fe320dc02c02";Source = {Id = "685a78e3-c891-d0c3-f973-1814b01edd28";PortNumber = None;PortType = PortType.Output;HostId = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f"};Target = {Id = "3b0171fa-dffe-f4c5-5f8c-e365112bae2f";PortNumber = None;PortType = PortType.Input;HostId = "638304a8-99e8-fe4f-4503-b50c64f45756"};Vertices = [420.0,230.0; 532.0,230.0]}
|
||||
]
|
278
Tests/CanvasStatesWithBuses.fs
Normal file
|
@ -0,0 +1,278 @@
|
|||
module CanvasStatesWithBuses
|
||||
|
||||
open CommonTypes
|
||||
open CanvasStates
|
||||
|
||||
/// Two inputs connected to a MergeWires component. No other connections.
|
||||
let stateBus1 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "08de9671-756c-44e0-905c-cde5b9a98aa9";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "528c3ccc-9554-6a5b-129f-c88e55478ae2";PortNumber = Some 0;PortType = PortType.Output;HostId = "08de9671-756c-44e0-905c-cde5b9a98aa9"}];X = 100;Y = 100};
|
||||
{H=50;W=40; Id = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "9de10edf-96be-beb0-2926-45f98b5dccb2";PortNumber = Some 0;PortType = PortType.Output;HostId = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc"}];X = 100;Y = 169};
|
||||
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "528c3ccc-9554-6a5b-129f-c88e55478ae2";PortNumber = None;PortType = PortType.Output;HostId = "08de9671-756c-44e0-905c-cde5b9a98aa9"};Target = {Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [130.0,110.0; 180.0,110.0; 180.0,138.0; 230.0,138.0]};
|
||||
{Id = "conn1";Source = {Id = "9de10edf-96be-beb0-2926-45f98b5dccb2";PortNumber = None;PortType = PortType.Output;HostId = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc"};Target = {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [130.0,179.0; 180.0,179.0; 180.0,158.0; 230.0,158.0]}
|
||||
]
|
||||
|
||||
/// A MergeWires connected to a SplitWire 1.
|
||||
let stateBus2 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138};
|
||||
{H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]}
|
||||
]
|
||||
|
||||
/// A MergeWires connected to a SplitWire 1 and a single-bit output node.
|
||||
let stateBus3 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138};
|
||||
{H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138}
|
||||
{H=50;W=40; Id = "7af6a475-990d-015f-e9e0-4a680cc84173";Type = Output 1;Label = "a";InputPorts = [{Id = "cefbb411-481e-d04d-c5a0-02f3921e423f";PortNumber = Some 0;PortType = PortType.Input;HostId = "7af6a475-990d-015f-e9e0-4a680cc84173"}];OutputPorts = [];X = 346;Y = 63}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]}
|
||||
{Id = "conn1";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "cefbb411-481e-d04d-c5a0-02f3921e423f";PortNumber = None;PortType = PortType.Input;HostId = "7af6a475-990d-015f-e9e0-4a680cc84173"};Vertices = [270.0,148.0; 308.0,148.0; 308.0,73.0; 346.0,73.0]}
|
||||
]
|
||||
|
||||
/// Like stateBus2 but with a loop.
|
||||
let stateBus4 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138};
|
||||
{H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]}
|
||||
{Id = "conn1";Source = {Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = None;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Target = {Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [376.0,138.0; 396.0,138.0; 396.0,138.0; 210.0,138.0; 210.0,138.0; 230.0,138.0]}
|
||||
]
|
||||
|
||||
/// All the bus components in series, properly connected. No other components.
|
||||
let stateBus6 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "52a4b421-c919-6177-c66c-ec2a77379373";Type = SplitWire 1;Label = "";InputPorts = [{Id = "07e65ee3-58a7-a5e0-724a-0f56f2e528c5";PortNumber = Some 0;PortType = PortType.Input;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}];OutputPorts = [{Id = "8e27936c-75e6-5ad1-777e-6aa111b2d584";PortNumber = Some 0;PortType = PortType.Output;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}; {Id = "1385e5ca-c8e7-b209-402f-b85c42023bdb";PortNumber = Some 1;PortType = PortType.Output;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}];X = 614;Y = 258};
|
||||
{H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248};
|
||||
{H=50;W=40; Id = "66dd284a-9199-fda1-867b-4e6b837a7ae5";Type = MergeWires;Label = "";InputPorts = [{Id = "2ee75313-e4e3-4ab8-9e36-a5089e49278d";PortNumber = Some 0;PortType = PortType.Input;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}; {Id = "a5d69516-6a23-a363-e86f-2fe2a062e722";PortNumber = Some 1;PortType = PortType.Input;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}];OutputPorts = [{Id = "caf8086a-b657-bc0a-5684-a25556b95845";PortNumber = Some 0;PortType = PortType.Output;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}];X = 153;Y = 258};
|
||||
{H=50;W=40; Id = "02e33421-bea8-657b-1e17-6e0df31696d5";Type = SplitWire 2;Label = "";InputPorts = [{Id = "ed9727f2-373b-9f23-9293-dacea5a5476b";PortNumber = Some 0;PortType = PortType.Input;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}];OutputPorts = [{Id = "7beda885-b4f4-f5be-ada5-476643c2cec3";PortNumber = Some 0;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}; {Id = "853f0e05-b301-db44-d437-d50abef0065b";PortNumber = Some 1;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}];X = 531;Y = 248};
|
||||
{H=50;W=40; Id = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67";Type = MergeWires;Label = "";InputPorts = [{Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}; {Id = "b26122bb-0ce1-8e3e-1021-a9aec7c4c0ca";PortNumber = Some 1;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];OutputPorts = [{Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];X = 329;Y = 258};
|
||||
{H=50;W=40; Id = "a7db69d3-5a34-e5d2-46d1-19fe8879b625";Type = SplitWire 1;Label = "";InputPorts = [{Id = "075ab754-bff4-ce21-0384-1f46f1ae986a";PortNumber = Some 0;PortType = PortType.Input;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}];OutputPorts = [{Id = "673c4ac0-9c68-6f3c-dfd4-6b129b956357";PortNumber = Some 0;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}; {Id = "3a314510-a373-0c2c-50c1-ac3ce9d5f4f7";PortNumber = Some 1;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}];X = 438;Y = 258}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "caf8086a-b657-bc0a-5684-a25556b95845";PortNumber = None;PortType = PortType.Output;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"};Target = {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [193.0,268.0; 230.0,268.0; 230.0,268.0; 241.0,268.0]};
|
||||
{Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = None;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Vertices = [281.0,258.0; 329.0,258.0]}
|
||||
{Id = "conn2";Source = {Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = None;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Target = {Id = "075ab754-bff4-ce21-0384-1f46f1ae986a";PortNumber = None;PortType = PortType.Input;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"};Vertices = [369.0,268.0; 438.0,268.0]};
|
||||
{Id = "conn3";Source = {Id = "673c4ac0-9c68-6f3c-dfd4-6b129b956357";PortNumber = None;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"};Target = {Id = "ed9727f2-373b-9f23-9293-dacea5a5476b";PortNumber = None;PortType = PortType.Input;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"};Vertices = [478.0,258.0; 531.0,258.0]};
|
||||
{Id = "conn4";Source = {Id = "853f0e05-b301-db44-d437-d50abef0065b";PortNumber = None;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"};Target = {Id = "07e65ee3-58a7-a5e0-724a-0f56f2e528c5";PortNumber = None;PortType = PortType.Input;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"};Vertices = [571.0,268.0; 614.0,268.0]};
|
||||
]
|
||||
|
||||
/// Non-inferrable loop: MergeWires connected to MergeWires and loop back.
|
||||
let stateBus7 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248};
|
||||
{H=50;W=40; Id = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67";Type = MergeWires;Label = "";InputPorts = [{Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}; {Id = "b26122bb-0ce1-8e3e-1021-a9aec7c4c0ca";PortNumber = Some 1;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];OutputPorts = [{Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];X = 325;Y = 258}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = None;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Target = {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [365.0,268.0; 385.0,268.0; 385.0,307.0; 221.0,307.0; 221.0,268.0; 241.0,268.0]};
|
||||
{Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = None;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Vertices = [281.0,258.0; 325.0,258.0]}
|
||||
]
|
||||
|
||||
/// Mux connected to two PushBusFirst. Width not inferrable.
|
||||
let stateBus8 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248};
|
||||
{H=50;W=40; Id = "3875f58b-8744-291d-1f4f-bca5b1a1eda5";Type = Mux2;Label = "mux2";InputPorts = [{Id = "6758d0e5-2618-afe4-473b-43c5002abf74";PortNumber = Some 0;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "401a0856-683d-6ed2-c193-53d1761ad7a4";PortNumber = Some 1;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "cf514335-b50d-eb19-c6f5-18303cda0b13";PortNumber = Some 2;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];OutputPorts = [{Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = Some 0;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];X = 145;Y = 190};
|
||||
{H=50;W=40; Id = "536f5ede-5b98-ce3f-db3e-e96de247a89b";Type = MergeWires;Label = "";InputPorts = [{Id = "b871e19d-2bec-0cc1-8c71-0fbee278bf51";PortNumber = Some 0;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}; {Id = "69b5caec-1da0-9ecb-d7fc-fbd9af66fc23";PortNumber = Some 1;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}];OutputPorts = [{Id = "6b2d64d3-7697-a97f-ed51-f0991d77b6b9";PortNumber = Some 0;PortType = PortType.Output;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}];X = 336;Y = 237}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = None;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"};Target = {Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [175.0,215.0; 208.0,215.0; 208.0,248.0; 241.0,248.0]};
|
||||
{Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "69b5caec-1da0-9ecb-d7fc-fbd9af66fc23";PortNumber = None;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"};Vertices = [281.0,258.0; 308.5,258.0; 308.5,257.0; 336.0,257.0]}
|
||||
]
|
||||
|
||||
/// And connected to a SplitWire 1.
|
||||
let stateBus9 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "3875f58b-8744-291d-1f4f-bca5b1a1eda5";Type = And;Label = "and";InputPorts = [{Id = "6758d0e5-2618-afe4-473b-43c5002abf74";PortNumber = Some 0;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "401a0856-683d-6ed2-c193-53d1761ad7a4";PortNumber = Some 1;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];OutputPorts = [{Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = Some 0;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];X = 145;Y = 190};
|
||||
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 262;Y = 205}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = None;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [175.0,215.0; 262.0,215.0]}
|
||||
]
|
||||
|
||||
/// Two inputs, packed into a bus, unpacked into two outputs.
|
||||
let stateBus10 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 336;Y = 205};
|
||||
{H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205};
|
||||
{H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175};
|
||||
{H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245};
|
||||
{H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "a-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 449;Y = 178};
|
||||
{H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"; Type = Output 1; Label = "b-out"; InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538"; PortNumber = Some 0; PortType = PortType.Input; HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}]; OutputPorts = []; X = 443; Y = 234}
|
||||
],
|
||||
[
|
||||
{Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]};
|
||||
{Id = "78ceafbf-cfb8-4442-a6bb-62ed6a1893cd";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [376.0,225.0; 409.5,225.0; 409.5,244.0; 443.0,244.0]};
|
||||
{Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [376.0,205.0; 412.5,205.0; 412.5,188.0; 449.0,188.0]};
|
||||
{Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]};
|
||||
{Id = "35d2c879-dda4-f719-836f-f6daf9803c85";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [275.0,215.0; 336.0,215.0]}
|
||||
]
|
||||
|
||||
/// Two inputs make a bus2, then Push input a to bus, then try to split into 2 single bits (fail).
|
||||
let stateBus11 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 410;Y = 200};
|
||||
{H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205};
|
||||
{H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175};
|
||||
{H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245};
|
||||
{H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "a-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 523;Y = 173};
|
||||
{H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b";Type = Output 1;Label = "b-out";InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = Some 0;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}];OutputPorts = [];X = 517;Y = 229};
|
||||
{H=50;W=40; Id = "94efe8d3-413b-9390-b627-be7bc91ae2d1";Type = MergeWires;Label = "";InputPorts = [{Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = Some 0;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}; {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = Some 1;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];OutputPorts = [{Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];X = 317;Y = 196}
|
||||
],
|
||||
[
|
||||
{Id = "conn";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [450.0,220.0; 483.5,220.0; 483.5,239.0; 517.0,239.0]};
|
||||
{Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [450.0,200.0; 503.0,200.0; 503.0,183.0; 523.0,183.0]};
|
||||
{Id = "conn1";Source = {Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = None;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [357.0,206.0; 383.5,206.0; 383.5,210.0; 410.0,210.0]};
|
||||
{Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]};
|
||||
{Id = "3fd09a23-18c1-0edd-b7cb-a70a4b8d42ef";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [275.0,215.0; 296.0,215.0; 296.0,216.0; 317.0,216.0]};
|
||||
{Id = "d429c2f2-d60c-0dc9-2279-7022dc127783";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,196.0; 317.0,196.0]};
|
||||
{Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]}
|
||||
]
|
||||
|
||||
/// Pack 4 bits into a bus, then extract them.
|
||||
let stateBus12 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 627;Y = 205};
|
||||
{H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205};
|
||||
{H=50;W=40; Id = "94efe8d3-413b-9390-b627-be7bc91ae2d1";Type = MergeWires;Label = "";InputPorts = [{Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = Some 0;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}; {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = Some 1;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];OutputPorts = [{Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];X = 299;Y = 195};
|
||||
{H=50;W=40; Id = "76de964a-124b-5c16-6de1-6158626344ac";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "9dc8cfaa-c989-276a-6703-11196c5c7974";PortNumber = Some 0;PortType = PortType.Output;HostId = "76de964a-124b-5c16-6de1-6158626344ac"}];X = 110;Y = 111};
|
||||
{H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175};
|
||||
{H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "c";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245};
|
||||
{H=50;W=40; Id = "9824ceb8-e999-8e48-9a56-7a4349e495b1";Type = Input 1;Label = "d";InputPorts = [];OutputPorts = [{Id = "712999dd-e970-51b3-f38f-aee70ff42d2d";PortNumber = Some 0;PortType = PortType.Output;HostId = "9824ceb8-e999-8e48-9a56-7a4349e495b1"}];X = 110;Y = 326};
|
||||
{H=50;W=40; Id = "c16668ed-ec17-3a14-8a4b-dec6c40335b5";Type = MergeWires;Label = "";InputPorts = [{Id = "38d99b30-a219-c37e-df55-04b7240a599e";PortNumber = Some 0;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}; {Id = "2f0c6067-124f-233b-1077-db88900c31cc";PortNumber = Some 1;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}];OutputPorts = [{Id = "6c5a63af-db72-1ece-495d-7a04c88fd1f0";PortNumber = Some 0;PortType = PortType.Output;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}];X = 364;Y = 205};
|
||||
{H=50;W=40; Id = "59b45f9c-192c-98ce-da25-a94db45a5790";Type = Output 1;Label = "a-out";InputPorts = [{Id = "e62e040a-bcd2-58f6-39d5-24548811b784";PortNumber = Some 0;PortType = PortType.Input;HostId = "59b45f9c-192c-98ce-da25-a94db45a5790"}];OutputPorts = [];X = 746;Y = 111};
|
||||
{H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "b-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 743;Y = 174};
|
||||
{H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b";Type = Output 1;Label = "c-out";InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = Some 0;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}];OutputPorts = [];X = 743;Y = 230};
|
||||
{H=50;W=40; Id = "214620f0-51f6-59fe-1558-ed47fd2c680a";Type = Output 1;Label = "d-out";InputPorts = [{Id = "b6e25648-a9a1-9c9c-935d-5f50a26c6c2b";PortNumber = Some 0;PortType = PortType.Input;HostId = "214620f0-51f6-59fe-1558-ed47fd2c680a"}];OutputPorts = [];X = 743;Y = 315};
|
||||
{H=50;W=40; Id = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2a6d1069-81da-f185-ad82-3c524819f56a";PortNumber = Some 0;PortType = PortType.Input;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}];OutputPorts = [{Id = "f72513fe-f696-dbae-133b-6c864c7075a2";PortNumber = Some 0;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}; {Id = "8333c9b0-911e-aab3-b7fd-026d97b4a412";PortNumber = Some 1;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}];X = 546;Y = 195};
|
||||
{H=50;W=40; Id = "156b43f1-5e54-b058-c716-c5623c5f6e37";Type = SplitWire 3;Label = "";InputPorts = [{Id = "67424fbf-f200-6690-a8e6-450e951d9411";PortNumber = Some 0;PortType = PortType.Input;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}];OutputPorts = [{Id = "58405846-6427-732c-c901-f72f1162b36e";PortNumber = Some 0;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}; {Id = "d40a1df5-6b29-5b4d-486f-925a2d16a615";PortNumber = Some 1;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}];X = 442;Y = 205}
|
||||
],
|
||||
[
|
||||
{Id = "5a9d111c-acec-3973-01ea-d0590e547b89";Source = {Id = "d40a1df5-6b29-5b4d-486f-925a2d16a615";PortNumber = None;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Target = {Id = "b6e25648-a9a1-9c9c-935d-5f50a26c6c2b";PortNumber = None;PortType = PortType.Input;HostId = "214620f0-51f6-59fe-1558-ed47fd2c680a"};Vertices = [482.0,225.0; 510.5,225.0; 510.5,325.0; 743.0,325.0]};
|
||||
{Id = "8f3205ca-5911-5a36-68da-4e8ca384c4a2";Source = {Id = "f72513fe-f696-dbae-133b-6c864c7075a2";PortNumber = None;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Target = {Id = "e62e040a-bcd2-58f6-39d5-24548811b784";PortNumber = None;PortType = PortType.Input;HostId = "59b45f9c-192c-98ce-da25-a94db45a5790"};Vertices = [586.0,195.0; 666.0,195.0; 666.0,121.0; 746.0,121.0]};
|
||||
{Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]};
|
||||
{Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]};
|
||||
{Id = "56e8c89b-bcbf-e674-a49d-72d06c20a563";Source = {Id = "712999dd-e970-51b3-f38f-aee70ff42d2d";PortNumber = None;PortType = PortType.Output;HostId = "9824ceb8-e999-8e48-9a56-7a4349e495b1"};Target = {Id = "2f0c6067-124f-233b-1077-db88900c31cc";PortNumber = None;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Vertices = [140.0,336.0; 344.0,336.0; 344.0,225.0; 364.0,225.0]};
|
||||
{Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [667.0,205.0; 723.0,205.0; 723.0,184.0; 743.0,184.0]};
|
||||
{Id = "78ceafbf-cfb8-4442-a6bb-62ed6a1893cd";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [667.0,225.0; 703.5,225.0; 703.5,240.0; 743.0,240.0]};
|
||||
{Id = "edc53e8b-8c1e-340f-aaec-7eecf337a9a8";Source = {Id = "9dc8cfaa-c989-276a-6703-11196c5c7974";PortNumber = None;PortType = PortType.Output;HostId = "76de964a-124b-5c16-6de1-6158626344ac"};Target = {Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [140.0,121.0; 279.5,121.0; 279.5,195.0; 299.5,195.0]};
|
||||
{Id = "3fd09a23-18c1-0edd-b7cb-a70a4b8d42ef";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [275.0,215.0; 299.5,215.0]};
|
||||
{Id = "7aaafe2c-9648-bb9d-95cb-7ed8c8309150";Source = {Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = None;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Target = {Id = "38d99b30-a219-c37e-df55-04b7240a599e";PortNumber = None;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Vertices = [339.5,205.0; 364.0,205.0]};
|
||||
{Id = "4852ec1c-5960-6696-b8c1-650b9517cb56";Source = {Id = "8333c9b0-911e-aab3-b7fd-026d97b4a412";PortNumber = None;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [586.0,215.0; 627.0,215.0]};
|
||||
{Id = "960e38bd-dd14-5109-ac25-8c701249f48b";Source = {Id = "6c5a63af-db72-1ece-495d-7a04c88fd1f0";PortNumber = None;PortType = PortType.Output;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Target = {Id = "67424fbf-f200-6690-a8e6-450e951d9411";PortNumber = None;PortType = PortType.Input;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Vertices = [404.0,215.0; 442.0,215.0]};
|
||||
{Id = "6d0843df-f606-4fb5-0349-ae90260e6c28";Source = {Id = "58405846-6427-732c-c901-f72f1162b36e";PortNumber = None;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Target = {Id = "2a6d1069-81da-f185-ad82-3c524819f56a";PortNumber = None;PortType = PortType.Input;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Vertices = [482.0,205.0; 546.0,205.0]}
|
||||
]
|
||||
|
||||
/// A 4 bit input connected to a 4 bit output.
|
||||
let stateBus13 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 4;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100};
|
||||
{H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 4;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100}
|
||||
],
|
||||
[
|
||||
{Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]}
|
||||
]
|
||||
|
||||
/// A 4 bit input connected to a 3 bit output.
|
||||
let stateBus14 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 4;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100};
|
||||
{H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 3;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100}
|
||||
],
|
||||
[
|
||||
{Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]}
|
||||
]
|
||||
|
||||
/// A 3 bit input connected to a 4 bit output.
|
||||
let stateBus15 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 3;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100};
|
||||
{H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 4;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100}
|
||||
],
|
||||
[
|
||||
{Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]}
|
||||
]
|
||||
|
||||
/// A 2 bit input split into 2 single bit outputs.
|
||||
let stateBus16 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5";Type = SplitWire 1;Label = "";InputPorts = [{Id = "a5977d59-b944-6651-bf91-3f3700bca60b";PortNumber = Some 0;PortType = PortType.Input;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}];OutputPorts = [{Id = "de1e9d70-4ce1-c6d9-cb87-30f632c9e1d1";PortNumber = Some 0;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}; {Id = "dc05cdf8-5ef7-c605-6c5b-bb8842c49089";PortNumber = Some 1;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}];X = 202;Y = 112};
|
||||
{H=50;W=40; Id = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "28047c34-2af2-867e-9130-6eb128769eef";PortNumber = Some 0;PortType = PortType.Output;HostId = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c"}];X = 102;Y = 112};
|
||||
{H=50;W=40; Id = "60e2df66-bb8c-53f1-832d-e154c30cf9dd";Type = Output 1;Label = "b";InputPorts = [{Id = "24e75289-91d1-30e7-0ec5-409eb73f9ad3";PortNumber = Some 0;PortType = PortType.Input;HostId = "60e2df66-bb8c-53f1-832d-e154c30cf9dd"}];OutputPorts = [];X = 324;Y = 88};
|
||||
{H=50;W=40; Id = "85e19389-c087-8b30-6c0a-02f7cc753695";Type = Output 1;Label = "c";InputPorts = [{Id = "99c1d8ae-5e85-fbbf-892d-48acb0fdff82";PortNumber = Some 0;PortType = PortType.Input;HostId = "85e19389-c087-8b30-6c0a-02f7cc753695"}];OutputPorts = [];X = 324;Y = 152}
|
||||
],
|
||||
[
|
||||
{Id = "conn0";Source = {Id = "28047c34-2af2-867e-9130-6eb128769eef";PortNumber = None;PortType = PortType.Output;HostId = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c"};Target = {Id = "a5977d59-b944-6651-bf91-3f3700bca60b";PortNumber = None;PortType = PortType.Input;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Vertices = [132.0,122.0; 202.0,122.0]};
|
||||
{Id = "conn1";Source = {Id = "dc05cdf8-5ef7-c605-6c5b-bb8842c49089";PortNumber = None;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Target = {Id = "99c1d8ae-5e85-fbbf-892d-48acb0fdff82";PortNumber = None;PortType = PortType.Input;HostId = "85e19389-c087-8b30-6c0a-02f7cc753695"};Vertices = [242.0,132.0; 283.0,132.0; 283.0,162.0; 324.0,162.0]};
|
||||
{Id = "conn2";Source = {Id = "de1e9d70-4ce1-c6d9-cb87-30f632c9e1d1";PortNumber = None;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Target = {Id = "24e75289-91d1-30e7-0ec5-409eb73f9ad3";PortNumber = None;PortType = PortType.Input;HostId = "60e2df66-bb8c-53f1-832d-e154c30cf9dd"};Vertices = [242.0,112.0; 283.0,112.0; 283.0,98.0; 324.0,98.0]}
|
||||
]
|
||||
|
||||
/// 3 bit input merged with 4 bit input, then split in the same way.
|
||||
let stateBus17 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "6bcdc74a-9d71-3304-537d-1a17f02924eb";Type = Input 3;Label = "in3";InputPorts = [];OutputPorts = [{Id = "9e8b16ba-d450-c228-e64c-d5323cd4ca0a";PortNumber = Some 0;PortType = PortType.Output;HostId = "6bcdc74a-9d71-3304-537d-1a17f02924eb"}];X = 100;Y = 100};
|
||||
{H=50;W=40; Id = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76";Type = Input 4;Label = "in4";InputPorts = [];OutputPorts = [{Id = "2cf62d71-2b34-ab11-9007-19409fe13b77";PortNumber = Some 0;PortType = PortType.Output;HostId = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76"}];X = 100;Y = 183};
|
||||
{H=50;W=40; Id = "71d66801-50d5-4316-eb79-9e99a43cdfe4";Type = MergeWires;Label = "";InputPorts = [{Id = "6714352e-6a15-a388-3f3f-27c7cb0e6fc7";PortNumber = Some 0;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}; {Id = "32c34b03-b0f0-16f5-345a-fca3626f16c3";PortNumber = Some 1;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}];OutputPorts = [{Id = "85cc42dd-5ea8-0f62-a421-74d844f4de83";PortNumber = Some 0;PortType = PortType.Output;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}];X = 190;Y = 138};
|
||||
{H=50;W=40; Id = "1a6e1bb4-cfe0-77f9-a207-f409168ef210";Type = Output 3;Label = "out3";InputPorts = [{Id = "ca111545-dbcd-e812-b81d-af6e51769f0e";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a6e1bb4-cfe0-77f9-a207-f409168ef210"}];OutputPorts = [];X = 375;Y = 89};
|
||||
{H=50;W=40; Id = "d2676492-2302-24d9-52eb-6e69e7971339";Type = Output 4;Label = "out4";InputPorts = [{Id = "819cf4ff-57a7-4743-075b-0c07a983a866";PortNumber = Some 0;PortType = PortType.Input;HostId = "d2676492-2302-24d9-52eb-6e69e7971339"}];OutputPorts = [];X = 369;Y = 216};
|
||||
{H=50;W=40; Id = "bb51f8c6-2c82-5206-eb25-492e15849e81";Type = SplitWire 3;Label = "";InputPorts = [{Id = "4a440c75-75c5-1a5c-93d9-97ca3993683f";PortNumber = Some 0;PortType = PortType.Input;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}];OutputPorts = [{Id = "68ca1398-18c8-cea1-c6c2-61393fb33e08";PortNumber = Some 0;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}; {Id = "be6c9827-eba7-6c19-ca75-7fcb1ac30dc9";PortNumber = Some 1;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}];X = 254;Y = 138}
|
||||
],
|
||||
[
|
||||
{Id = "9df32195-00b4-9795-3dc1-78fb70d453f2";Source = {Id = "68ca1398-18c8-cea1-c6c2-61393fb33e08";PortNumber = None;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Target = {Id = "ca111545-dbcd-e812-b81d-af6e51769f0e";PortNumber = None;PortType = PortType.Input;HostId = "1a6e1bb4-cfe0-77f9-a207-f409168ef210"};Vertices = [294.0,138.0; 334.5,138.0; 334.5,99.0; 375.0,99.0]};
|
||||
{Id = "82cc4ce9-7b15-40ac-0226-98a7f8e2fb9a";Source = {Id = "be6c9827-eba7-6c19-ca75-7fcb1ac30dc9";PortNumber = None;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Target = {Id = "819cf4ff-57a7-4743-075b-0c07a983a866";PortNumber = None;PortType = PortType.Input;HostId = "d2676492-2302-24d9-52eb-6e69e7971339"};Vertices = [294.0,158.0; 331.5,158.0; 331.5,226.0; 369.0,226.0]};
|
||||
{Id = "cd13c70f-6037-0cf4-1295-5795e92d745c";Source = {Id = "9e8b16ba-d450-c228-e64c-d5323cd4ca0a";PortNumber = None;PortType = PortType.Output;HostId = "6bcdc74a-9d71-3304-537d-1a17f02924eb"};Target = {Id = "6714352e-6a15-a388-3f3f-27c7cb0e6fc7";PortNumber = None;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Vertices = [130.0,110.0; 160.0,110.0; 160.0,138.0; 190.0,138.0]};
|
||||
{Id = "7438de0c-bbaf-c1f6-0307-42ece66c6c00";Source = {Id = "2cf62d71-2b34-ab11-9007-19409fe13b77";PortNumber = None;PortType = PortType.Output;HostId = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76"};Target = {Id = "32c34b03-b0f0-16f5-345a-fca3626f16c3";PortNumber = None;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Vertices = [130.0,193.0; 160.0,193.0; 160.0,158.0; 190.0,158.0]};
|
||||
{Id = "678ffa07-0ed7-7b6f-ba9b-b14839c08a71";Source = {Id = "85cc42dd-5ea8-0f62-a421-74d844f4de83";PortNumber = None;PortType = PortType.Output;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Target = {Id = "4a440c75-75c5-1a5c-93d9-97ca3993683f";PortNumber = None;PortType = PortType.Input;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Vertices = [230.0,148.0; 254.0,148.0]}
|
||||
]
|
||||
|
||||
/// Partially connected Mux2. Top input (2 bits), select (1 bit) anc connection
|
||||
/// to output (2 bits).
|
||||
let stateBus18 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125};
|
||||
{H=50;W=40; Id = "ed12b5d8-556b-515a-cc9d-873960690380";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}];X = 122;Y = 204};
|
||||
{H=50;W=40; Id = "d7028a8f-83be-0d81-6f0f-19b384caddae";Type = Mux2;Label = "";InputPorts = [{Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = Some 0;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91";PortNumber = Some 1;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = Some 2;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];OutputPorts = [{Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = Some 0;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];X = 244;Y = 156};
|
||||
{H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 373;Y = 171}
|
||||
],
|
||||
[
|
||||
{Id = "conn-sel";Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = None;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"};Target = {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,214.0; 259.0,214.0; 259.0,201.0]};
|
||||
{Id = "conn-top-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,135.0; 198.0,135.0; 198.0,172.0; 244.0,172.6]};
|
||||
{Id = "conn-to-output";Source = {Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = None;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [274.0,181.0; 373.0,181.0]}
|
||||
]
|
||||
|
||||
/// Fully connected Mux, but two inputs have different widths. Similar to
|
||||
/// stateBus18.
|
||||
let stateBus19 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125};
|
||||
{H=50;W=40; Id = "ed12b5d8-556b-515a-cc9d-873960690380";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}];X = 122;Y = 204};
|
||||
{H=50;W=40; Id = "d7028a8f-83be-0d81-6f0f-19b384caddae";Type = Mux2;Label = "";InputPorts = [{Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = Some 0;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91";PortNumber = Some 1;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = Some 2;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];OutputPorts = [{Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = Some 0;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];X = 244;Y = 156};
|
||||
{H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 373;Y = 171}
|
||||
],
|
||||
[
|
||||
{Id = "conn-sel";Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = None;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"};Target = {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,214.0; 259.0,214.0; 259.0,201.0]};
|
||||
{Id = "conn-top-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,135.0; 198.0,135.0; 198.0,172.0; 244.0,172.6]};
|
||||
{Id = "conn-to-output";Source = {Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = None;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [274.0,181.0; 373.0,181.0]}
|
||||
{Id = "conn-bottom-input"; Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8"; PortNumber = None; PortType = PortType.Output; HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}; Target = {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91"; PortNumber = None; PortType = PortType.Input; HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; Vertices = [152.0,258.0; 198.0,258.0; 198.0,189.33333333333334; 244.0,189.33333333333334]}
|
||||
]
|
||||
|
||||
/// Partially connected Demux. A 2-bit input, Mux, a 2-bit output.
|
||||
let stateBus20 : CanvasState =
|
||||
[
|
||||
{H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125};
|
||||
{H=50;W=40; Id = "fbfb4202-9816-f214-0401-da18caddeb0f";Type = Demux2;Label = "";InputPorts = [{Id = "2b224026-609a-5eae-6885-ff9820dbae5f";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}; {Id = "68043f9b-47e7-793f-fed2-943a7d7336dc";PortNumber = Some 1;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}];OutputPorts = [{Id = "57070484-347e-4701-8c36-f510c2ef150c";PortNumber = Some 0;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}; {Id = "123463bf-7868-9a87-6fb1-36627a3c9bad";PortNumber = Some 1;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}];X = 254;Y = 110};
|
||||
{H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 401;Y = 117}
|
||||
],
|
||||
[
|
||||
{Id = "conn-to-output";Source = {Id = "57070484-347e-4701-8c36-f510c2ef150c";PortNumber = None;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [284.0,126.66666666666667; 343.5,126.66666666666667; 343.5,127.0; 401.0,127.0]};
|
||||
{Id = "conn-to-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "2b224026-609a-5eae-6885-ff9820dbae5f";PortNumber = None;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"};Vertices = [152.0,135.0; 254.0,135.0]}
|
||||
]
|
101
Tests/SimulatorMemoriesTests.fs
Normal file
|
@ -0,0 +1,101 @@
|
|||
module SimulatorMemoriesTests
|
||||
|
||||
open CommonTypes
|
||||
open SimulatorTypes
|
||||
open CanvasStatesMemories
|
||||
open NumberHelpers
|
||||
open Helpers
|
||||
|
||||
/// Tuple with: (diagramName, state, loadedComponents, number of clock ticks, inputss).
|
||||
/// Note that the inputss is a list of inputs. I.e. inputss provides an inputs
|
||||
/// for every time step. The first set of inputs will be fed before the first
|
||||
/// clock tick, then second after the second clock tick and so on. If no inputs
|
||||
/// are provided for a certain iteration, none will fed.
|
||||
type private TestCaseInput = string * CanvasState * LoadedComponent list * int * ((ComponentId * WireData) list) list
|
||||
type private IterationOutput = (SimulationIO * WireData) list // Output after every clock tick.
|
||||
type private TestCaseOutput = Result<IterationOutput list, SimulationError>
|
||||
type private TestCase = string * TestCaseInput * TestCaseOutput
|
||||
|
||||
let private toWD num w = convertIntToWireData w (int64 num)
|
||||
|
||||
let private makeStateMem3Input addr dataIn write =
|
||||
[ (ComponentId "81030fc6-2471-a568-160f-922709edeb2e", toWD addr 3)
|
||||
(ComponentId "266d8763-6fbf-37c2-6825-d3487153053b", toWD dataIn 4)
|
||||
(ComponentId "f0769200-24e3-5c7b-3591-c5c3711d9336", toWD write 1) ]
|
||||
|
||||
let private makeStateMem3Output dataOut =
|
||||
[ (ComponentId "1f9704f9-88fc-124c-3ff8-21c36cfb7328", ComponentLabel "data-out", 4), toWD dataOut 4 ]
|
||||
|
||||
let testCasesSimulatorMemories : TestCase list = [
|
||||
"Synchronous ROM connected to address and output",
|
||||
("main", stateMem1, [], 6, [
|
||||
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 0 2) ]
|
||||
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 1 2) ]
|
||||
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 2 2) ]
|
||||
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 3 2) ]
|
||||
]),
|
||||
Ok [
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 0 4 ] // Mem[0]
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 0 4 ] // Mem[0]
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 1 4 ] // Mem[1]
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 4 4 ] // Mem[2]
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 15 4 ] // Mem[3]
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 15 4 ] // Mem[3]
|
||||
]
|
||||
|
||||
"Synchronous ROM connected to address and output. ROM is big.",
|
||||
("main", stateMem2, [], pow2(8)+1, (
|
||||
[0..pow2(8)-1] |> List.map (fun i ->
|
||||
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD i 8) ]
|
||||
)
|
||||
)),
|
||||
Ok (
|
||||
[ [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 8), toWD 0 8 ] ] // Mem[0]
|
||||
@
|
||||
(
|
||||
[0..pow2(8)-1] |> List.map (fun i ->
|
||||
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 8), toWD i 8 ]
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
"RAM only writes if write flag is set",
|
||||
("main", stateMem3, [], 10, [
|
||||
makeStateMem3Input 0 1 0
|
||||
makeStateMem3Input 0 1 0
|
||||
makeStateMem3Input 0 1 1 // Turn on write flag. Set to one.
|
||||
makeStateMem3Input 0 0 1 // Set to zero.
|
||||
makeStateMem3Input 0 1 1 // Set to one.
|
||||
makeStateMem3Input 0 0 0 // Turn off write flag. Stays at one.
|
||||
makeStateMem3Input 0 0 0
|
||||
makeStateMem3Input 0 0 0
|
||||
makeStateMem3Input 0 0 0
|
||||
makeStateMem3Input 0 0 0
|
||||
]),
|
||||
Ok [
|
||||
makeStateMem3Output 0 // Mem[0], unchanged
|
||||
makeStateMem3Output 0 // Mem[0], unchanged
|
||||
makeStateMem3Output 0 // Mem[0], unchanged
|
||||
makeStateMem3Output 1 // Mem[0], set to 1
|
||||
makeStateMem3Output 0 // Mem[0], set to 0
|
||||
makeStateMem3Output 1 // Mem[0], set to 1
|
||||
makeStateMem3Output 1 // Mem[0], stays 1
|
||||
makeStateMem3Output 1 // Mem[0], stays 1
|
||||
makeStateMem3Output 1 // Mem[0], stays 1
|
||||
makeStateMem3Output 1 // Mem[0], stays 1
|
||||
]
|
||||
|
||||
"RAM writes and reads all locations.",
|
||||
("main", stateMem3, [], 17,
|
||||
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Input i (i+1) 1) ) // Write all locations.
|
||||
@
|
||||
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Input i 0 0) ) // Read all locations.
|
||||
),
|
||||
Ok (
|
||||
[ makeStateMem3Output 0 ]
|
||||
@
|
||||
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Output <| i+1) )
|
||||
@
|
||||
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Output <| i+1) )
|
||||
)
|
||||
]
|
214
Tests/SimulatorSyncTests.fs
Normal file
|
@ -0,0 +1,214 @@
|
|||
module SimulatorSyncTests
|
||||
|
||||
open CommonTypes
|
||||
open SimulatorTypes
|
||||
open CanvasStatesSync
|
||||
|
||||
/// Tuple with: (diagramName, state, loadedComponents, number of clock ticks, inputss).
|
||||
/// Note that the inputss is a list of inputs. I.e. inputss provides an inputs
|
||||
/// for every time step. The first set of inputs will be fed before the first
|
||||
/// clock tick, then second after the second clock tick and so on. If no inputs
|
||||
/// are provided for a certain iteration, none will fed.
|
||||
type private TestCaseInput = string * CanvasState * LoadedComponent list * int * ((ComponentId * WireData) list) list
|
||||
type private IterationOutput = (SimulationIO * WireData) list // Output after every clock tick.
|
||||
type private TestCaseOutput = Result<IterationOutput list, SimulationError>
|
||||
type private TestCase = string * TestCaseInput * TestCaseOutput
|
||||
|
||||
let testCasesSimulatorSync : TestCase list = [
|
||||
"Simple D-flip-flop, one input, one output (zero)",
|
||||
("main", stateSync1, [], 5, [
|
||||
[ (ComponentId "6e7a2000-439c-108e-df6d-93cff7a41266", [Zero]) ]
|
||||
]),
|
||||
Ok (
|
||||
// Check it is zero for 5 ticks.
|
||||
[(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]
|
||||
|> List.replicate 5
|
||||
)
|
||||
|
||||
"Simple D-flip-flop, one input, one output (one)",
|
||||
("main", stateSync1, [], 5, [
|
||||
[ (ComponentId "6e7a2000-439c-108e-df6d-93cff7a41266", [One]) ]
|
||||
]),
|
||||
Ok (
|
||||
// Tick 0, out is zero.
|
||||
[[(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]]
|
||||
@
|
||||
// Then out is 1 four times.
|
||||
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]]
|
||||
|> List.replicate 4)
|
||||
)
|
||||
|
||||
"Two D-flip-flop connected in series, one input, one output (one)",
|
||||
("main", stateSync2, [], 5, [
|
||||
[ (ComponentId "3739e54a-fd21-bf60-8fc2-a3d10108c947", [One]) ]
|
||||
]),
|
||||
Ok (
|
||||
// Tick 0 and 1, out is zero.
|
||||
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]
|
||||
|> List.replicate 2)
|
||||
@
|
||||
// Then out is 1 three times.
|
||||
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]]
|
||||
|> List.replicate 3)
|
||||
)
|
||||
|
||||
"Three D-flip-flop connected in series, one input, one output (one)",
|
||||
("main", stateSync3, [], 5, [
|
||||
[ (ComponentId "3739e54a-fd21-bf60-8fc2-a3d10108c947", [One]) ]
|
||||
]),
|
||||
Ok (
|
||||
// Tick 0,1 and 2, out is zero.
|
||||
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]
|
||||
|> List.replicate 3)
|
||||
@
|
||||
// Then out is 1 two times.
|
||||
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]]
|
||||
|> List.replicate 2)
|
||||
)
|
||||
|
||||
"StateSync1 custom component followed by a DFF (one)",
|
||||
("main", stateSync4, [stateSync1Dependency], 5, [
|
||||
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ]
|
||||
]),
|
||||
Ok (
|
||||
// Tick 0 and 1, out is zero.
|
||||
([(ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero]]
|
||||
|> List.replicate 2)
|
||||
@
|
||||
// Then out is 1 three times.
|
||||
([(ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One]]
|
||||
|> List.replicate 3)
|
||||
)
|
||||
|
||||
"StateSync1 custom component followed by a DFF, time varying inputs",
|
||||
("main", stateSync4, [stateSync1Dependency], 10, [
|
||||
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ]
|
||||
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [Zero]) ]
|
||||
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ]
|
||||
]),
|
||||
Ok [
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ]
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ]
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // After 2 timesteps, the One arrives.
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ] // Back to Zero.
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // Back to One.
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // And statys one...
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
|
||||
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
|
||||
]
|
||||
|
||||
"A DFF looping to itself via a Not gate. Two output nodes to probe the wires before and after the Not gate.",
|
||||
("main", stateSync5, [], 4, []),
|
||||
Ok [
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
|
||||
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
|
||||
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
|
||||
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
|
||||
]
|
||||
|
||||
"Similar to stateSync5, but with a stateSync1 custom component instead of a DFF.",
|
||||
("main", stateSync6, [stateSync1Dependency], 4, []),
|
||||
Ok [
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
|
||||
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
|
||||
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
|
||||
|
||||
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
|
||||
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
|
||||
]
|
||||
|
||||
"A connected to output via both sync and comb paths.",
|
||||
("main", stateSync7, [], 4, [
|
||||
[(ComponentId "ff10125a-601f-e1d5-e379-7eb7c65eb91f", [One])]
|
||||
[(ComponentId "ff10125a-601f-e1d5-e379-7eb7c65eb91f", [Zero])]
|
||||
]),
|
||||
Ok [
|
||||
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [One]
|
||||
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ]
|
||||
|
||||
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero]
|
||||
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [One] ]
|
||||
|
||||
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero]
|
||||
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ]
|
||||
|
||||
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero]
|
||||
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ]
|
||||
]
|
||||
|
||||
"stateSync7 Not-ed self looped in the synchronous branch.",
|
||||
("main", stateSync8, [stateSync7Dependency], 4, []),
|
||||
Ok [
|
||||
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [One] ]
|
||||
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [Zero] ]
|
||||
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [One] ]
|
||||
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [Zero] ]
|
||||
]
|
||||
|
||||
"stateSync8 wrapped",
|
||||
("main", stateSync9, [stateSync8Dependency; stateSync7Dependency], 4, []),
|
||||
Ok [
|
||||
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [One] ]
|
||||
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [Zero] ]
|
||||
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [One] ]
|
||||
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [Zero] ]
|
||||
]
|
||||
|
||||
"A fully connected DFFE.",
|
||||
("main", stateSync10, [], 8, [
|
||||
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero]) // in
|
||||
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [Zero]) ] // enable
|
||||
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero])
|
||||
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable
|
||||
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [One])
|
||||
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable
|
||||
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero])
|
||||
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [Zero]) ] // turn off enable
|
||||
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [One])
|
||||
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable again
|
||||
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero])
|
||||
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // set to zero
|
||||
]),
|
||||
Ok [
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ]
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ]
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // enabled but zero
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // set to one
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // enable is off
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // enable is on again
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // set to zero
|
||||
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // set to zero
|
||||
]
|
||||
|
||||
"StateSync7 Not-ed self looped in the combinatorial branch.",
|
||||
("main", stateSync11, [stateSync7Dependency], 4, []),
|
||||
Error {
|
||||
Msg = "Cycle detected in combinatorial logic."
|
||||
InDependency = None
|
||||
ComponentsAffected = ["c9d9659a-4476-de3a-a838-eeab15496c99"; "5c24921a-88e9-7bc2-ee89-97fefb694902"] |> List.map ComponentId
|
||||
ConnectionsAffected = ["bc1f9a51-5ca8-1aa0-b4bd-b86bc9646c20"; "cc7a9da2-f78a-f3e1-1c2f-7323f2b43d15"] |> List.map ConnectionId
|
||||
}
|
||||
|
||||
"StateSync11 connected to an output. Should spot cycle in the dependency.",
|
||||
("main", stateSync12, [stateSync11Dependency; stateSync7Dependency], 4, []),
|
||||
Error {
|
||||
Msg = "Cycle detected in combinatorial logic."
|
||||
InDependency = Some "combinatorial-loop"
|
||||
ComponentsAffected = ["c9d9659a-4476-de3a-a838-eeab15496c99"; "5c24921a-88e9-7bc2-ee89-97fefb694902"] |> List.map ComponentId
|
||||
ConnectionsAffected = [] // Connections are not inferred in dependencies.
|
||||
}
|
||||
]
|
457
Tests/SimulatorTests.fs
Normal file
|
@ -0,0 +1,457 @@
|
|||
module SimulatorTests
|
||||
|
||||
open CommonTypes
|
||||
open SimulatorTypes
|
||||
open CanvasStates
|
||||
open CanvasStatesWithBuses
|
||||
open Simulator
|
||||
|
||||
/// Tuple with: (diagramName, state, loadedComponents, inputs).
|
||||
type private SimulatorTestCaseInput = string * CanvasState * LoadedComponent list * (ComponentId * WireData) list
|
||||
type private SimulatorTestCaseOutput = Result<(SimulationIO * WireData) list, SimulationError>
|
||||
type private SimulatorTestCase = string * SimulatorTestCaseInput * SimulatorTestCaseOutput
|
||||
|
||||
let private makeError msg deps comps conns =
|
||||
Error {
|
||||
Msg = msg
|
||||
InDependency = deps
|
||||
ComponentsAffected = comps |> List.map ComponentId
|
||||
ConnectionsAffected = conns |> List.map ConnectionId
|
||||
}
|
||||
|
||||
/// Given a list of N generic elements, associate each element with a bit and
|
||||
/// return 2^N lists with all the possible bit combinations.
|
||||
/// A bit is simply a bus with width 1.
|
||||
let makeAllBitCombinations (lst : 'a list) : (('a * WireData) list) list =
|
||||
let rec allCombinations lst result stack =
|
||||
match lst with
|
||||
| [] -> List.rev stack :: result
|
||||
| el :: lst' ->
|
||||
let result = allCombinations lst' result ((el,[Zero]) :: stack)
|
||||
allCombinations lst' result ((el,[One]) :: stack)
|
||||
List.rev <| allCombinations lst [] []
|
||||
|
||||
/// Auto generate all the testcases for a CanvasState (i.e. a full thruth
|
||||
/// table). The thruth table considers ALL inputs to be single bit inputs,
|
||||
/// please do not use this function if not all inputs are like that.
|
||||
let private createAllTestCases
|
||||
(title : string)
|
||||
(diagramName : string)
|
||||
(state : CanvasState)
|
||||
(dependencies : LoadedComponent list)
|
||||
(inputLabels : ComponentId list)
|
||||
(expectedResults : ((SimulationIO * WireData) list) list)
|
||||
: SimulatorTestCase list =
|
||||
let allInputCombinations = makeAllBitCombinations inputLabels
|
||||
assert(List.length allInputCombinations = List.length expectedResults)
|
||||
(allInputCombinations, expectedResults)
|
||||
||> List.map2 (fun inputs outputs ->
|
||||
sprintf "%s: %A" title inputs,
|
||||
(diagramName, state, dependencies, inputs),
|
||||
Ok outputs
|
||||
)
|
||||
|
||||
// The input to a test case is formed by:
|
||||
// - a CanvasState,
|
||||
// - a list of loaded dependencies,
|
||||
// - a list of input values that will be applied to the simulation graph.
|
||||
|
||||
// The dependency list and the inputs do not matter since the test has to fail
|
||||
// in the earlier checks.
|
||||
let private testCasesSimulatorPortError : SimulatorTestCase list = [
|
||||
"Unconnected input node",
|
||||
("", state1, [], []),
|
||||
makeError
|
||||
"All ports must have at least one connection."
|
||||
None
|
||||
["input-node0"]
|
||||
[]
|
||||
|
||||
"Two unconnected input nodes",
|
||||
("", state2, [], []),
|
||||
makeError
|
||||
"All ports must have at least one connection."
|
||||
None
|
||||
["input-node0"]
|
||||
[]
|
||||
|
||||
"Two inputs and one output",
|
||||
("", state5, [], []),
|
||||
makeError
|
||||
"A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component."
|
||||
None
|
||||
["output-node0"]
|
||||
[]
|
||||
|
||||
"Two inputs, one And, one output, with extra connection input to output",
|
||||
("", state7, [], []),
|
||||
makeError
|
||||
"A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component."
|
||||
None
|
||||
["output"]
|
||||
[]
|
||||
|
||||
"Two inputs, one And, one output, with extra connections inputs to and",
|
||||
("", state8, [], []),
|
||||
makeError
|
||||
"A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component."
|
||||
None
|
||||
["and"]
|
||||
[]
|
||||
|
||||
"Mux2 with only two connected ports",
|
||||
("", state9, [], []),
|
||||
makeError
|
||||
"All ports must have at least one connection."
|
||||
None
|
||||
["mux"]
|
||||
[]
|
||||
]
|
||||
|
||||
let private testCasesSimulatorDuplicatIOError : SimulatorTestCase list = [
|
||||
"Simple circuit with duplicated output label",
|
||||
("", state14, [], []),
|
||||
makeError
|
||||
"Two Output components cannot have the same label: output-duplicate-label."
|
||||
None
|
||||
["output-node0"; "output-node1"]
|
||||
[]
|
||||
|
||||
"Simple And circuit with duplicated input label",
|
||||
("", state15, [], []),
|
||||
makeError
|
||||
"Two Input components cannot have the same label: input-duplicate-label."
|
||||
None
|
||||
["top-input"; "bottom-input"]
|
||||
[]
|
||||
]
|
||||
|
||||
let private testCasesSimulatorCycleError : SimulatorTestCase list = [
|
||||
"Complex diagram with three Ands and two cycles",
|
||||
("", state10, [], []),
|
||||
makeError
|
||||
"Cycle detected in combinatorial logic."
|
||||
None
|
||||
["and2"; "and0"]
|
||||
["conn5"; "conn4"]
|
||||
|
||||
"Complex diagram with three Ands and one long cycle",
|
||||
("", state11, [], []),
|
||||
makeError
|
||||
"Cycle detected in combinatorial logic."
|
||||
None
|
||||
["and1"; "and2"; "and0"]
|
||||
["conn1"; "conn5"; "conn3"]
|
||||
]
|
||||
|
||||
// In the next tests, we have no dependencies.
|
||||
// The inputs are set since the simulation graph should be fine.
|
||||
let private testCasesSimulatorOkNoDependencies : SimulatorTestCase list =
|
||||
createAllTestCases
|
||||
"Simple circuit with one input and one output"
|
||||
"main" state3 [] [ComponentId "input-node0"]
|
||||
[
|
||||
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"Simple circuit with one input connected to two outputs"
|
||||
"main" state4 [] [ComponentId "input-node0"]
|
||||
[
|
||||
[
|
||||
(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]
|
||||
(ComponentId "output-node1", ComponentLabel "output-node1-label", 1), [Zero]
|
||||
]
|
||||
[
|
||||
(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]
|
||||
(ComponentId "output-node1", ComponentLabel "output-node1-label", 1), [One]
|
||||
]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"Two inputs; one And; one output"
|
||||
"main" state6 [] [ComponentId "top-input"; ComponentId "bottom-input"]
|
||||
[
|
||||
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [One]]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"Weird diagram with a series of and gates"
|
||||
"main" state12 [] [ComponentId "input"]
|
||||
[
|
||||
[(ComponentId "output", ComponentLabel "output", 1), [Zero]]
|
||||
[(ComponentId "output", ComponentLabel "output", 1), [One]]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"One bit adder (Zero, Zero)"
|
||||
"main" state13 [] [
|
||||
ComponentId "2953603d-44e4-5c1f-3fb1-698f7863b6b5"
|
||||
ComponentId "170e69f4-b3d7-d9e0-9f1d-6a564ba62062"
|
||||
]
|
||||
[
|
||||
[
|
||||
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [Zero]
|
||||
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero]
|
||||
]
|
||||
[
|
||||
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [One]
|
||||
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero]
|
||||
]
|
||||
[
|
||||
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [One]
|
||||
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero]
|
||||
]
|
||||
[
|
||||
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [Zero]
|
||||
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [One]
|
||||
]
|
||||
]
|
||||
|
||||
let testCasesSimulatorDependencyError : SimulatorTestCase list =
|
||||
createAllTestCases
|
||||
"Broken unused dependency." // Since the dependency is unused the test should pass.
|
||||
"main" state3 [state1Dependency] [ComponentId "input-node0"]
|
||||
[
|
||||
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]]
|
||||
]
|
||||
@
|
||||
[
|
||||
// Broken dependencies.
|
||||
|
||||
"Input connected to broken depdendency.",
|
||||
("main", state19, [state1Dependency], []),
|
||||
makeError
|
||||
"All ports must have at least one connection."
|
||||
(Some "broken-one-input") [] []
|
||||
|
||||
// Dependency cycle.
|
||||
|
||||
"Component using itself.",
|
||||
(state16Dependency.Name, state20, [state16Dependency], []),
|
||||
makeError
|
||||
(sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\"." state16Dependency.Name state16Dependency.Name)
|
||||
None [] []
|
||||
|
||||
"Long cycle starting at root.",
|
||||
(state23Dependency.Name, state23, [state21Dependency; state22Dependency], []),
|
||||
makeError
|
||||
(sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\" --> \"%s\" --> \"%s\"." state23Dependency.Name state21Dependency.Name state22Dependency.Name state23Dependency.Name)
|
||||
None [] []
|
||||
|
||||
"Long cycle.",
|
||||
("main", state24, [state21Dependency; state22Dependency; state23Dependency], []),
|
||||
makeError
|
||||
(sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\" --> \"%s\" --> \"%s\"." state23Dependency.Name state21Dependency.Name state22Dependency.Name state23Dependency.Name)
|
||||
None [] []
|
||||
|
||||
// Missing dependencies.
|
||||
|
||||
"2 bit full adder missing dependencies",
|
||||
("2-bit-adder", twoBitAdderState, [], []),
|
||||
makeError
|
||||
"Could not resolve dependency: \"full-adder\". Make sure a dependency with such name exists in the current project."
|
||||
(Some "2-bit-adder") [] []
|
||||
|
||||
"2 bit full adder missing half adder dependency",
|
||||
("2-bit-adder", twoBitAdderState, [fullAdderDependency], []),
|
||||
makeError
|
||||
"Could not resolve dependency: \"half-adder\". Make sure a dependency with such name exists in the current project."
|
||||
(Some "full-adder") [] []
|
||||
|
||||
"2 bit full adder missing full adder dependency",
|
||||
("2-bit-adder", twoBitAdderState, [halfAdderDependency], []),
|
||||
makeError
|
||||
"Could not resolve dependency: \"full-adder\". Make sure a dependency with such name exists in the current project."
|
||||
(Some "2-bit-adder") [] []
|
||||
]
|
||||
|
||||
// Outputs fot the 2bit adder test.
|
||||
|
||||
let private zero = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
|
||||
]
|
||||
let private one = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
|
||||
]
|
||||
let private two = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
|
||||
]
|
||||
let private three = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
|
||||
]
|
||||
let private four = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
|
||||
]
|
||||
let private five = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
|
||||
]
|
||||
let private six = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
|
||||
]
|
||||
let private seven = [
|
||||
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
|
||||
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
|
||||
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
|
||||
]
|
||||
|
||||
let testCasesSimulatorOkWithDependencies : SimulatorTestCase list =
|
||||
createAllTestCases
|
||||
"Simple input-output dependency" "main"
|
||||
state16 [state3Dependency] [ComponentId "outer-input-node0"]
|
||||
[
|
||||
[(ComponentId "outer-output-node0", ComponentLabel "outer-output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "outer-output-node0", ComponentLabel "outer-output-node0-label", 1), [One]]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"Nested input-output dependency" "main"
|
||||
state17 [state16Dependency; state3Dependency] [ComponentId "outer-outer-input-node0"]
|
||||
[
|
||||
[(ComponentId "outer-outer-output-node0", ComponentLabel "outer-outer-output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "outer-outer-output-node0", ComponentLabel "outer-outer-output-node0-label", 1), [One]]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"Doubly nested input-output dependency" "main"
|
||||
state18 [state17Dependency; state16Dependency; state3Dependency] [ComponentId "outer-outer-outer-input-node0"]
|
||||
[
|
||||
[(ComponentId "outer-outer-outer-output-node0", ComponentLabel "outer-outer-outer-output-node0-label", 1), [Zero]]
|
||||
[(ComponentId "outer-outer-outer-output-node0", ComponentLabel "outer-outer-outer-output-node0-label", 1), [One]]
|
||||
]
|
||||
@
|
||||
createAllTestCases
|
||||
"2 bit adder" "2-bit-adder"
|
||||
twoBitAdderState [fullAdderDependency; halfAdderDependency] [
|
||||
ComponentId "78795182-35c4-1c50-2190-6fc944a2adea" // Cin
|
||||
ComponentId "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1" // B1
|
||||
ComponentId "69a6ad2a-af19-369f-0483-0e09e6841da3" // B0
|
||||
ComponentId "82a03f0b-ae31-b487-ed1b-335e235adeb7" // A1
|
||||
ComponentId "86372781-c2f4-09f2-406f-f385ee7a47a9" // A0
|
||||
]
|
||||
[
|
||||
zero;one;two;three;
|
||||
one;two;three;four;
|
||||
two;three;four;five;
|
||||
three;four;five;six;
|
||||
one;two;three;four;
|
||||
two;three;four;five;
|
||||
three;four;five;six;
|
||||
four;five;six;seven
|
||||
]
|
||||
|
||||
let private testCasesSimulatorBusesError : SimulatorTestCase list = [
|
||||
"Two inputs make a bus2, then Push input a to bus, then try to split into 2 single bits (fail)",
|
||||
("main", stateBus11, [], []),
|
||||
makeError "Wrong wire width. Target port expects a 1 bit(s) signal, but source port produces a 2 bit(s) signal." None [] ["conn"]
|
||||
|
||||
"A 4 bit input connected to a 3 bit output",
|
||||
("main", stateBus14, [], []),
|
||||
makeError "Wrong wire width. Target port expects a 3 bit(s) signal, but source port produces a 4 bit(s) signal." None [] ["conn"]
|
||||
|
||||
"A 3 bit input connected to a 4 bit output",
|
||||
("main", stateBus15, [], []),
|
||||
makeError "Wrong wire width. Target port expects a 4 bit(s) signal, but source port produces a 3 bit(s) signal." None [] ["conn"]
|
||||
]
|
||||
|
||||
let private testCasesSimulatorOkWithBuses : SimulatorTestCase list =
|
||||
createAllTestCases
|
||||
"Two inputs, packed into a bus, unpacked into two outputs" "main"
|
||||
stateBus10 [] [
|
||||
ComponentId "a91be585-2d3b-d872-be0f-b416c8eb03d2" // a
|
||||
ComponentId "9985ebc6-1cd5-8863-1341-1d543d236d38" // b
|
||||
]
|
||||
(makeAllBitCombinations [
|
||||
(ComponentId "8a9392fc-493b-7e96-72ec-b6f5f11ded8a", ComponentLabel "a-out", 1)
|
||||
(ComponentId "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b", ComponentLabel "b-out", 1)
|
||||
])
|
||||
@
|
||||
createAllTestCases
|
||||
"Four inputs, packed into a bus, unpacked into four outputs" "main"
|
||||
stateBus12 [] [
|
||||
ComponentId "76de964a-124b-5c16-6de1-6158626344ac" // a
|
||||
ComponentId "a91be585-2d3b-d872-be0f-b416c8eb03d2" // b
|
||||
ComponentId "9985ebc6-1cd5-8863-1341-1d543d236d38" // c
|
||||
ComponentId "9824ceb8-e999-8e48-9a56-7a4349e495b1" // d
|
||||
]
|
||||
(makeAllBitCombinations [
|
||||
(ComponentId "59b45f9c-192c-98ce-da25-a94db45a5790", ComponentLabel "a-out", 1)
|
||||
(ComponentId "8a9392fc-493b-7e96-72ec-b6f5f11ded8a", ComponentLabel "b-out", 1)
|
||||
(ComponentId "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b", ComponentLabel "c-out", 1)
|
||||
(ComponentId "214620f0-51f6-59fe-1558-ed47fd2c680a", ComponentLabel "d-out", 1)
|
||||
])
|
||||
@
|
||||
[
|
||||
"A 4 bit input connected to a four bit output (1)",
|
||||
("main", stateBus13, [], [
|
||||
ComponentId "9bcba47e-deae-0b3f-2079-a1b124526b00", [One; One; One; One]
|
||||
]),
|
||||
[
|
||||
(ComponentId "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97", ComponentLabel "b", 4), [One; One; One; One]
|
||||
] |> Ok
|
||||
|
||||
"A 4 bit input connected to a four bit output (2)",
|
||||
("main", stateBus13, [], [
|
||||
ComponentId "9bcba47e-deae-0b3f-2079-a1b124526b00", [Zero; One; Zero; One]
|
||||
]),
|
||||
[
|
||||
(ComponentId "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97", ComponentLabel "b", 4), [Zero; One; Zero; One]
|
||||
] |> Ok
|
||||
|
||||
"A 2 bit input split into 2 single bit outputs (1)",
|
||||
("main", stateBus16, [], [
|
||||
ComponentId "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c", [One; Zero]
|
||||
]),
|
||||
[
|
||||
(ComponentId "60e2df66-bb8c-53f1-832d-e154c30cf9dd", ComponentLabel "b", 1), [One]
|
||||
(ComponentId "85e19389-c087-8b30-6c0a-02f7cc753695", ComponentLabel "c", 1), [Zero]
|
||||
] |> Ok
|
||||
|
||||
"A 2 bit input split into 2 single bit outputs (2)",
|
||||
("main", stateBus16, [], [
|
||||
ComponentId "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c", [Zero; One]
|
||||
]),
|
||||
[
|
||||
(ComponentId "60e2df66-bb8c-53f1-832d-e154c30cf9dd", ComponentLabel "b", 1), [Zero]
|
||||
(ComponentId "85e19389-c087-8b30-6c0a-02f7cc753695", ComponentLabel "c", 1), [One]
|
||||
] |> Ok
|
||||
|
||||
"3 bit input merged with 4 bit input, then split in the same way",
|
||||
("main", stateBus17, [], [
|
||||
ComponentId "6bcdc74a-9d71-3304-537d-1a17f02924eb", [One; Zero; One] // 3 bits.
|
||||
ComponentId "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76", [Zero; One; Zero; One] // 4 bits.
|
||||
]),
|
||||
[
|
||||
(ComponentId "1a6e1bb4-cfe0-77f9-a207-f409168ef210", ComponentLabel "out3", 3), [One; Zero; One]
|
||||
(ComponentId "d2676492-2302-24d9-52eb-6e69e7971339", ComponentLabel "out4", 4), [Zero; One; Zero; One]
|
||||
] |> Ok
|
||||
]
|
||||
|
||||
let testCasesSimulator =
|
||||
testCasesSimulatorPortError @
|
||||
testCasesSimulatorCycleError @
|
||||
testCasesSimulatorDuplicatIOError @
|
||||
testCasesSimulatorOkNoDependencies @
|
||||
testCasesSimulatorDependencyError @
|
||||
testCasesSimulatorOkWithDependencies @
|
||||
testCasesSimulatorBusesError @
|
||||
testCasesSimulatorOkWithBuses
|
18
Tests/TestLib.fs
Normal file
|
@ -0,0 +1,18 @@
|
|||
module TestLib
|
||||
|
||||
open Expecto
|
||||
|
||||
/// Create a testcase for unit testing a function.
|
||||
let testFunction f testData =
|
||||
let descr, inp, expectedOut = testData
|
||||
testCase descr <| fun () ->
|
||||
let actual = f inp
|
||||
Expect.equal actual expectedOut ""
|
||||
|
||||
/// Create an expecto testList from a list of testCases.
|
||||
let createTestList descr f testCases =
|
||||
testList descr <| List.map (testFunction f) testCases
|
||||
|
||||
/// Run all the previously defined tests.
|
||||
let runTests () =
|
||||
runTestsInAssembly defaultConfig [||] |> ignore
|
84
Tests/Tests.fs
Normal file
|
@ -0,0 +1,84 @@
|
|||
open TestLib
|
||||
open Expecto
|
||||
open Simulator
|
||||
open BusWidthInferer
|
||||
open SimulatorTests
|
||||
open SimulatorSyncTests
|
||||
open SimulatorMemoriesTests
|
||||
open WidthInfererTests
|
||||
open EEExtensions
|
||||
|
||||
let runSimulatorTest (diagramName, state, loadedComponents, inputs) =
|
||||
// Build simulation graph.
|
||||
match prepareSimulation diagramName state loadedComponents with
|
||||
| Error e -> Error e
|
||||
| Ok simData ->
|
||||
// Feed all the inputs and extract the outputs.
|
||||
(simData.Graph, inputs)
|
||||
||> List.fold (fun graph (inputId, bit) -> feedSimulationInput graph inputId bit)
|
||||
|> extractSimulationIOs simData.Outputs
|
||||
|> Ok
|
||||
|
||||
let safeListItem lst idx =
|
||||
if idx >= List.length lst then [] else List.item idx lst
|
||||
|
||||
let runSimulatorSyncTest (diagramName, state, loadedComponents, ticks, inputss) =
|
||||
// Build simulation graph.
|
||||
match prepareSimulation diagramName state loadedComponents with
|
||||
| Error e -> Error e
|
||||
| Ok simData ->
|
||||
let results, graph =
|
||||
(simData.Graph, [0..ticks-1])
|
||||
||> List.mapFold (fun graph i ->
|
||||
// Feed the inputs for this time iteration before the clock
|
||||
// tick.
|
||||
let inputs = safeListItem inputss i
|
||||
let graph =
|
||||
(graph, inputs)
|
||||
||> List.fold (fun graph (inputId, bit) ->
|
||||
feedSimulationInput graph inputId bit)
|
||||
// Extract output, then feed a new clock tick.
|
||||
extractSimulationIOs simData.Outputs graph, feedClockTick graph
|
||||
)
|
||||
Ok results
|
||||
|
||||
[<Tests>]
|
||||
let simulatorTests =
|
||||
createTestList "simulator" runSimulatorTest testCasesSimulator
|
||||
[<Tests>]
|
||||
let simulatorSyncTests =
|
||||
createTestList "simulatorSync" runSimulatorSyncTest testCasesSimulatorSync
|
||||
[<Tests>]
|
||||
let simulatorMemoriesTests =
|
||||
createTestList "simulatorMemories" runSimulatorSyncTest testCasesSimulatorMemories
|
||||
[<Tests>]
|
||||
let widthInfererTests =
|
||||
createTestList "widthInferer" inferConnectionsWidth testCasesWidthInferer
|
||||
|
||||
let mutable Watches: Map<string,System.Diagnostics.Stopwatch> = Map.empty
|
||||
|
||||
|
||||
/// dotnet core timer function
|
||||
let stopTimer s =
|
||||
let timer = Map.tryFind s Watches
|
||||
match timer with
|
||||
| None -> failwithf "error: Timer '%s' has been stopped before it was started. timers: %A" s (Map.keys Watches)
|
||||
| Some stopWatch ->
|
||||
stopWatch.Stop()
|
||||
printfn "%s: %.4fms" s stopWatch.Elapsed.TotalMilliseconds
|
||||
|
||||
/// dotnet core timer function
|
||||
let startTimer s =
|
||||
Watches <- Map.add s (System.Diagnostics.Stopwatch.StartNew()) Watches
|
||||
|
||||
/// measure various dotnet core performance stats
|
||||
/// m = structure size.
|
||||
/// n = number of iterations.
|
||||
let displayPerformance m n = Helpers.checkPerformance m n startTimer stopTimer
|
||||
|
||||
|
||||
[<EntryPoint>]
|
||||
let main argv =
|
||||
displayPerformance 100 1000000
|
||||
//TestLib.runTests ()
|
||||
0
|
24
Tests/Tests.fsproj
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestLib.fs" />
|
||||
<Compile Include="CanvasStates.fs" />
|
||||
<Compile Include="CanvasStatesWithBuses.fs" />
|
||||
<Compile Include="CanvasStatesSync.fs" />
|
||||
<Compile Include="CanvasStatesMemories.fs" />
|
||||
<Compile Include="WidthInfererTests.fs" />
|
||||
<Compile Include="SimulatorTests.fs" />
|
||||
<Compile Include="SimulatorSyncTests.fs" />
|
||||
<Compile Include="SimulatorMemoriesTests.fs" />
|
||||
<Compile Include="Tests.fs" />
|
||||
</ItemGroup>
|
||||
<!-- Dependencies -->
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Expecto.FsCheck" Version="8.13.1" />
|
||||
</ItemGroup>
|
||||
<Import Project="..\.paket\Paket.Restore.targets" />
|
||||
</Project>
|
184
Tests/WidthInfererTests.fs
Normal file
|
@ -0,0 +1,184 @@
|
|||
module WidthInfererTests
|
||||
|
||||
open CommonTypes
|
||||
open CanvasStates
|
||||
open CanvasStatesWithBuses
|
||||
|
||||
type private WidthInfererTestCaseInput = CanvasState
|
||||
type private WidthInfererTestCaseOutput = Result<ConnectionsWidth, WidthInferError>
|
||||
type private WidhtInfererTestCase = string * WidthInfererTestCaseInput * WidthInfererTestCaseOutput
|
||||
|
||||
let private testCasesWidthInfererSimple : WidhtInfererTestCase list = [
|
||||
"Two unconnected input nodes. No conections", state2,
|
||||
Ok Map.empty
|
||||
|
||||
"Simple circuit with one input connected to one output", state3,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Simple circuit with one input connected to two outputs", state4,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn1", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Two inputs; one And; one output", state6,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn1", Some 1
|
||||
ConnectionId "conn2", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Partially connected and: missing bottom connections", state25,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn2", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Partially connected and: missing connection to output", state26,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn1", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Partially connected and: missing both input connections", state27,
|
||||
[
|
||||
ConnectionId "conn2", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"One input and one output, connected to the state3CustomComponent", state16,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn1", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Nested custom components", state18,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn1", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
]
|
||||
|
||||
let private testCasesWidthInfererBuses : WidhtInfererTestCase list = [
|
||||
"Two inputs connected to a MergeWires component. No other connections", stateBus1,
|
||||
[
|
||||
ConnectionId "conn0", Some 1
|
||||
ConnectionId "conn1", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"A MergeWires connected to a SplitWire 1.", stateBus2,
|
||||
[
|
||||
ConnectionId "conn0", None
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"A MergeWires connected to a SplitWire 1 and a single-bit output node", stateBus3,
|
||||
[
|
||||
ConnectionId "conn0", None
|
||||
ConnectionId "conn1", None
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"A MergeWires connected to a SplitWire 1, with loop", stateBus4,
|
||||
[
|
||||
ConnectionId "conn0", None
|
||||
ConnectionId "conn1", None
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"All the bus components in series, properly connected. No other components", stateBus6,
|
||||
[
|
||||
ConnectionId "conn0", None
|
||||
ConnectionId "conn1", None
|
||||
ConnectionId "conn2", None
|
||||
ConnectionId "conn3", None
|
||||
ConnectionId "conn4", None
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Non-inferrable loop", stateBus7,
|
||||
[
|
||||
ConnectionId "conn0", None
|
||||
ConnectionId "conn1", None
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Mux connected to two MergeWires. Width not inferrable", stateBus8,
|
||||
[
|
||||
ConnectionId "conn0", None
|
||||
ConnectionId "conn1", None
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"A 4 bit input connected to a four bit output", stateBus13,
|
||||
[
|
||||
ConnectionId "conn", Some 4
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"A 2 bit input split into 2 single bit outputs", stateBus16,
|
||||
[
|
||||
ConnectionId "conn0", Some 2
|
||||
ConnectionId "conn1", Some 1
|
||||
ConnectionId "conn2", Some 1
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"3 bit input merged with 4 bit input, then split in the same way", stateBus17,
|
||||
[
|
||||
ConnectionId "678ffa07-0ed7-7b6f-ba9b-b14839c08a71", Some 7
|
||||
ConnectionId "7438de0c-bbaf-c1f6-0307-42ece66c6c00", Some 4
|
||||
ConnectionId "82cc4ce9-7b15-40ac-0226-98a7f8e2fb9a", Some 4
|
||||
ConnectionId "9df32195-00b4-9795-3dc1-78fb70d453f2", Some 3
|
||||
ConnectionId "cd13c70f-6037-0cf4-1295-5795e92d745c", Some 3
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Partially connected Mux2", stateBus18,
|
||||
[
|
||||
ConnectionId "conn-sel", Some 1
|
||||
ConnectionId "conn-top-input", Some 2
|
||||
ConnectionId "conn-to-output", Some 2
|
||||
] |> Map.ofList |> Ok
|
||||
|
||||
"Partially connected Demux2", stateBus20,
|
||||
[
|
||||
ConnectionId "conn-to-input", Some 2
|
||||
ConnectionId "conn-to-output", Some 2
|
||||
] |> Map.ofList |> Ok
|
||||
]
|
||||
|
||||
let private testCasesWidthInfererError : WidhtInfererTestCase list = [
|
||||
"Two inputs connected to the same output", state5,
|
||||
Error {
|
||||
Msg = "A wire must have precisely one driving component. If you want to merge two wires together, use a MergeWires component."
|
||||
ConnectionsAffected = ["conn1"; "conn0"] |> List.map ConnectionId
|
||||
}
|
||||
|
||||
"Two inputs; one And; one output; with extra connection input to output", state7,
|
||||
Error {
|
||||
Msg = "A wire must have precisely one driving component. If you want to merge two wires together, use a MergeWires component."
|
||||
ConnectionsAffected = ["conn3"; "conn2"] |> List.map ConnectionId
|
||||
}
|
||||
|
||||
"And connected to a SplitWire 1", stateBus9,
|
||||
Error {
|
||||
Msg = "Wrong wire width. Target port expects a signal with at least 2 bits, but source port produces a 1 bit(s) signal."
|
||||
ConnectionsAffected = ["conn0"] |> List.map ConnectionId
|
||||
}
|
||||
|
||||
"A 4 bit input connected to a 3 bit output", stateBus14,
|
||||
Error {
|
||||
Msg = "Wrong wire width. Target port expects a 3 bit(s) signal, but source port produces a 4 bit(s) signal."
|
||||
ConnectionsAffected = ["conn"] |> List.map ConnectionId
|
||||
}
|
||||
|
||||
"A 3 bit input connected to a 4 bit output", stateBus15,
|
||||
Error {
|
||||
Msg = "Wrong wire width. Target port expects a 4 bit(s) signal, but source port produces a 3 bit(s) signal."
|
||||
ConnectionsAffected = ["conn"] |> List.map ConnectionId
|
||||
}
|
||||
|
||||
"Fully connected Mux, but two inputs have different widths", stateBus19,
|
||||
Error {
|
||||
Msg = "Wrong wire width. The two inputs to a multiplexer are expected to have the same width, but top input has 2 bits and bottom input has 1 bits."
|
||||
ConnectionsAffected = ["conn-top-input"; "conn-bottom-input"] |> List.map ConnectionId
|
||||
}
|
||||
]
|
||||
|
||||
let testCasesWidthInferer : WidhtInfererTestCase list =
|
||||
testCasesWidthInfererSimple @
|
||||
testCasesWidthInfererBuses @
|
||||
testCasesWidthInfererError
|
59
Tests/logStateToFSharp.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
# Python script that helps transforming the result of logging a file back into
|
||||
# an f# data structure.
|
||||
# Useful when writing the CanvasStates for the tests.
|
||||
|
||||
import re
|
||||
|
||||
state = """
|
||||
[
|
||||
{Id = 8078a917-236f-5a40-18a6-8e2d6a1458f5;Type = Input 2;Label = a;InputPorts = [];OutputPorts = [{Id = cc7c6510-d49b-28d9-e0bc-d5350a2c76a8;PortNumber = 0;PortType = Output;HostId = 8078a917-236f-5a40-18a6-8e2d6a1458f5}];X = 122;Y = 125};
|
||||
{Id = fbfb4202-9816-f214-0401-da18caddeb0f;Type = Demux2;Label = ;InputPorts = [{Id = 2b224026-609a-5eae-6885-ff9820dbae5f;PortNumber = 0;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}; {Id = 68043f9b-47e7-793f-fed2-943a7d7336dc;PortNumber = 1;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}];OutputPorts = [{Id = 57070484-347e-4701-8c36-f510c2ef150c;PortNumber = 0;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}; {Id = 123463bf-7868-9a87-6fb1-36627a3c9bad;PortNumber = 1;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}];X = 254;Y = 110};
|
||||
{Id = 00661085-7d05-4185-09ef-4138ac918ad2;Type = Output 2;Label = aa;InputPorts = [{Id = 7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45;PortNumber = 0;PortType = Input;HostId = 00661085-7d05-4185-09ef-4138ac918ad2}];OutputPorts = [];X = 401;Y = 117}
|
||||
],
|
||||
[
|
||||
{Id = 1ef71074-fa16-a068-84a0-18d324e3ada6;Source = {Id = 57070484-347e-4701-8c36-f510c2ef150c;PortNumber = null;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f};Target = {Id = 7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45;PortNumber = null;PortType = Input;HostId = 00661085-7d05-4185-09ef-4138ac918ad2};Vertices = [284,126.66666666666667; 343.5,126.66666666666667; 343.5,127; 401,127]};
|
||||
{Id = f326a7a3-79d5-4ace-f0cf-606657fc2c42;Source = {Id = cc7c6510-d49b-28d9-e0bc-d5350a2c76a8;PortNumber = null;PortType = Output;HostId = 8078a917-236f-5a40-18a6-8e2d6a1458f5};Target = {Id = 2b224026-609a-5eae-6885-ff9820dbae5f;PortNumber = null;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f};Vertices = [152,135; 254,135]}
|
||||
]
|
||||
"""
|
||||
|
||||
def applyAll(functions, init):
|
||||
res = init
|
||||
for f in functions:
|
||||
res = f(res)
|
||||
return res
|
||||
|
||||
def addQuotesId(str):
|
||||
return re.sub(r'Id = ([0-9a-z\-]*)', r'Id = "\1"', str)
|
||||
|
||||
def addQuotesLabel(str):
|
||||
return re.sub(r'Label = ([0-9a-zA-Z\-]*)', r'Label = "\1"', str)
|
||||
|
||||
def addPortTypeDot(str):
|
||||
return re.sub(r'PortType = (Input|Output)', r'PortType = PortType.\1', str)
|
||||
|
||||
def replaceNull(str):
|
||||
return re.sub(r'PortNumber = null;', r'PortNumber = None;', str)
|
||||
|
||||
def replacePortNumberSome(str):
|
||||
return re.sub(r'PortNumber = (\d);', r'PortNumber = Some \1;', str)
|
||||
|
||||
def replaceCustomName(str):
|
||||
return re.sub(r'Name = ([0-9a-zA-Z\-]*)', r'Name = "\1"', str)
|
||||
|
||||
def replaceLabels(str):
|
||||
return re.sub(r'InputLabels = [([0-9a-zA-Z\-]*); ]', r'Label = "\1"', str)
|
||||
|
||||
def replaceFloat(str):
|
||||
return re.sub(r'(\d\d+)(,|;|])', r'\1.0\2', str)
|
||||
|
||||
functions = [
|
||||
addQuotesId,
|
||||
addQuotesLabel,
|
||||
addPortTypeDot,
|
||||
replaceNull,
|
||||
replacePortNumberSome,
|
||||
replaceCustomName,
|
||||
replaceFloat,
|
||||
]
|
||||
|
||||
print(applyAll(functions, state))
|
13
Tests/paket.references
Normal file
|
@ -0,0 +1,13 @@
|
|||
group Electron
|
||||
Fable.Core
|
||||
Fable.Browser.Dom
|
||||
Fable.Electron
|
||||
Fable.Elmish
|
||||
Fable.Elmish.React
|
||||
Fable.Elmish.Debugger
|
||||
Fable.Elmish.HMR
|
||||
Fable.Node
|
||||
Fable.Promise
|
||||
Fable.React
|
||||
Fulma
|
||||
Fable.SimpleJson
|
6
build.cmd
Normal file
|
@ -0,0 +1,6 @@
|
|||
@echo off
|
||||
cls
|
||||
dotnet tool restore
|
||||
dotnet paket install
|
||||
:: dotnet restore build.proj
|
||||
dotnet fake build -t %*
|
99
build.fsx
Normal file
|
@ -0,0 +1,99 @@
|
|||
#r "paket: groupref FakeBuild //"
|
||||
#load ".fake/build.fsx/intellisense.fsx"
|
||||
|
||||
#if !FAKE
|
||||
#r "netstandard"
|
||||
#r "Facades/netstandard" // https://github.com/ionide/ionide-vscode-fsharp/issues/839#issuecomment-396296095
|
||||
#endif
|
||||
|
||||
open System
|
||||
open Fake.Core
|
||||
open Fake.Core.TargetOperators
|
||||
open Fake.DotNet
|
||||
open Fake.IO
|
||||
open Fake.IO.Globbing.Operators
|
||||
open Fake.IO.FileSystemOperators
|
||||
open Fake.JavaScript
|
||||
|
||||
Target.create "CleanDev" (fun _ ->
|
||||
!! "src/**/bin"
|
||||
++ "src/**/obj"
|
||||
++ "dist"
|
||||
++ ".fable"
|
||||
|> Shell.cleanDirs
|
||||
)
|
||||
|
||||
Target.create "Clean" (fun _ ->
|
||||
!! "src/**/bin"
|
||||
++ "src/**/obj"
|
||||
++ "dist"
|
||||
++ ".fable"
|
||||
|> Shell.cleanDirs
|
||||
Target.run 1 "KillZombies" []
|
||||
)
|
||||
|
||||
Target.create "CleanFableJS" <| fun _ ->
|
||||
!! (__SOURCE_DIRECTORY__ @@ "src/**/*.fs.js")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "src/**/*.map")
|
||||
|> Seq.toList
|
||||
|> File.deleteAll
|
||||
|
||||
Target.create "CleanNode" <| fun _ ->
|
||||
Shell.cleanDir (__SOURCE_DIRECTORY__ @@ "node_modules")
|
||||
File.delete (__SOURCE_DIRECTORY__ @@ "package-lock.json")
|
||||
|
||||
Target.create "DotnetRestore" (fun _ ->
|
||||
Shell.Exec("dotnet","restore issie.sln") |> ignore)
|
||||
|
||||
Target.create "NpmInstall" (fun _ ->
|
||||
Npm.install id
|
||||
)
|
||||
|
||||
Target.create "Build" (fun _ ->
|
||||
Npm.run "compile" id
|
||||
)
|
||||
|
||||
Target.create "Dev" (fun _ ->
|
||||
Npm.run "dev" id
|
||||
)
|
||||
|
||||
Target.create "Dist" (fun _ ->
|
||||
Npm.run "dist" id
|
||||
)
|
||||
|
||||
Target.create "DistDir" (fun _ ->
|
||||
Npm.run "dist:dir" id
|
||||
)
|
||||
|
||||
Target.create "KillZombies" <| fun _ ->
|
||||
Fake.Core.Process.killAllByName "issie.exe"
|
||||
Fake.Core.Process.killAllByName "node"
|
||||
Fake.Core.Process.killAllByName "dotnet"
|
||||
|
||||
// Build order
|
||||
|
||||
"CleanFableJS"
|
||||
==> "Clean"
|
||||
|
||||
"CleanFableJS"
|
||||
==> "CleanDev"
|
||||
|
||||
"CleanDev"
|
||||
==> "DotnetRestore"
|
||||
==> "NpmInstall"
|
||||
==> "Build"
|
||||
|
||||
"NpmInstall"
|
||||
==> "Dev"
|
||||
|
||||
"NpmInstall"
|
||||
==> "Dist"
|
||||
|
||||
"NpmInstall"
|
||||
==> "DistDir"
|
||||
|
||||
"CleanFableJS"
|
||||
==> "dev"
|
||||
|
||||
// start build
|
||||
Target.runOrDefaultWithArguments "Dev"
|
5
build.fsx.lock
Normal file
|
@ -0,0 +1,5 @@
|
|||
STORAGE: NONE
|
||||
RESTRICTION: || (== net6.0) (== netstandard2.0)
|
||||
NUGET
|
||||
remote: https://api.nuget.org/v3/index.json
|
||||
FSharp.Core (6.0.1)
|
785
build.old.fsx
Normal file
|
@ -0,0 +1,785 @@
|
|||
// --------------------------------------------------------------------------------------
|
||||
// FAKE build script
|
||||
// --------------------------------------------------------------------------------------
|
||||
#nowarn "0213"
|
||||
#r "paket: groupref FakeBuild //"
|
||||
#load "./tools/FSharpLint.fs"
|
||||
#load "./tools/ElectronTools.fs"
|
||||
#load "./tools/Updating.fs"
|
||||
#load "./.fake/build.fsx/intellisense.fsx"
|
||||
|
||||
open BlackFox.CommandLine
|
||||
open Fake.Core
|
||||
open Fake.Core.TargetOperators
|
||||
open Fake.DotNet
|
||||
open Fake.JavaScript
|
||||
open Fake.IO
|
||||
open Fake.IO.FileSystemOperators
|
||||
open Fake.IO.Globbing.Operators
|
||||
open Fake.Net.Http
|
||||
open Fake.Tools
|
||||
open Fantomas.FakeHelpers
|
||||
open Fantomas.FormatConfig
|
||||
open Tools.Electron
|
||||
open Tools.Linting
|
||||
open Tools.Updating
|
||||
open System
|
||||
open System.IO
|
||||
|
||||
// The name of the project
|
||||
// (used by attributes in AssemblyInfo, name of a NuGet package and directory in 'src')
|
||||
let project = "issie"
|
||||
|
||||
// Short summary of the project
|
||||
// (used as description in AssemblyInfo and as a short summary for NuGet package)
|
||||
let summary = "Schematic editor and Simulator"
|
||||
|
||||
// Author(s) of the project
|
||||
let author = "tomcl"
|
||||
|
||||
// File system information
|
||||
let solutionFile = "issie.sln"
|
||||
|
||||
// Build docs website root
|
||||
let website = "https://tomcl.github.io/issie/docs"
|
||||
|
||||
// Github repository
|
||||
let repo = @"https://github.com/tomcl/issie"
|
||||
|
||||
// Web or JS related fs projects
|
||||
// Projects that have bindings to other languages where name linting needs to be more relaxed.
|
||||
let relaxedNameLinting =
|
||||
[ (__SOURCE_DIRECTORY__ @@ "src/Electron/**/*.fs") ]
|
||||
|
||||
let netCoreVersions = [ "netcoreapp3.1" ]
|
||||
|
||||
// OS runtime targets
|
||||
let runTimes = ["win-x64";"linux-x64"]
|
||||
|
||||
// Read additional information from the release notes document
|
||||
let release = ReleaseNotes.load (__SOURCE_DIRECTORY__ @@ "RELEASE_NOTES.md")
|
||||
|
||||
// Helper active pattern for project types
|
||||
let (|Fsproj|Csproj|Vbproj|Shproj|) (projFileName:string) =
|
||||
match projFileName with
|
||||
| f when f.EndsWith("fsproj") -> Fsproj
|
||||
| f when f.EndsWith("csproj") -> Csproj
|
||||
| f when f.EndsWith("vbproj") -> Vbproj
|
||||
| f when f.EndsWith("shproj") -> Shproj
|
||||
| _ -> failwith (sprintf "Project file %s not supported. Unknown project type." projFileName)
|
||||
|
||||
let tools = __SOURCE_DIRECTORY__ @@ "tools"
|
||||
let srcGlob = __SOURCE_DIRECTORY__ @@ "src/**/*.??proj"
|
||||
let fsSrcGlob = __SOURCE_DIRECTORY__ @@ "src/**/*.fs"
|
||||
let fsTestGlob = __SOURCE_DIRECTORY__ @@ "tests/**/*.fs"
|
||||
let bin = __SOURCE_DIRECTORY__ @@ "bin"
|
||||
let temp = __SOURCE_DIRECTORY__ @@ "temp"
|
||||
let objFolder = __SOURCE_DIRECTORY__ @@ "obj"
|
||||
let dist = __SOURCE_DIRECTORY__ @@ "dist"
|
||||
let fable = __SOURCE_DIRECTORY__ @@ ".fable"
|
||||
let fsProjGlob =
|
||||
!! (__SOURCE_DIRECTORY__ @@ "src/**/*.fsproj")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "tests/**/*.fsproj")
|
||||
|
||||
let foldExcludeGlobs (g: IGlobbingPattern) (d: string) = g -- d
|
||||
let foldIncludeGlobs (g: IGlobbingPattern) (d: string) = g ++ d
|
||||
|
||||
let fsSrcAndTest =
|
||||
!! fsSrcGlob
|
||||
++ fsTestGlob
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/obj/**")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "tests/**/obj/**")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/**/AssemblyInfo.*")
|
||||
|
||||
let fsRelaxedNameLinting =
|
||||
let baseGlob s =
|
||||
!! s
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/obj/**")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "tests/**/obj/**")
|
||||
match relaxedNameLinting with
|
||||
| [h] when relaxedNameLinting.Length = 1 -> baseGlob h |> Some
|
||||
| h::t -> List.fold foldIncludeGlobs (baseGlob h) t |> Some
|
||||
| _ -> None
|
||||
|
||||
let failOnBadExitAndPrint (p : ProcessResult) =
|
||||
if p.ExitCode <> 0 then
|
||||
p.Errors |> Seq.iter Trace.traceError
|
||||
failwithf "failed with exitcode %d" p.ExitCode
|
||||
|
||||
module dotnet =
|
||||
let tool optionConfig command args =
|
||||
DotNet.exec (fun p -> { p with WorkingDirectory = tools} |> optionConfig ) (sprintf "%s" command) args
|
||||
|> failOnBadExitAndPrint
|
||||
|
||||
let femto optionConfig args =
|
||||
tool optionConfig (!!(__SOURCE_DIRECTORY__ @@ "packages/tooling/Femto/tools/**/**/Femto.dll") |> Seq.head) args
|
||||
|
||||
let setCmd f args =
|
||||
match Environment.isWindows with
|
||||
| true -> Command.RawCommand(f, Arguments.OfArgs args)
|
||||
| false -> Command.RawCommand("mono", Arguments.OfArgs (f::args))
|
||||
|
||||
let configuration() =
|
||||
FakeVar.getOrDefault "configuration" "Release"
|
||||
|
||||
let getEnvFromAllOrNone (s: string) =
|
||||
let envOpt (envVar: string) =
|
||||
if String.isNullOrEmpty envVar then None
|
||||
else Some(envVar)
|
||||
|
||||
let procVar = Environment.GetEnvironmentVariable(s) |> envOpt
|
||||
let userVar = Environment.GetEnvironmentVariable(s, EnvironmentVariableTarget.User) |> envOpt
|
||||
let machVar = Environment.GetEnvironmentVariable(s, EnvironmentVariableTarget.Machine) |> envOpt
|
||||
|
||||
match procVar,userVar,machVar with
|
||||
| Some(v), _, _
|
||||
| _, Some(v), _
|
||||
| _, _, Some(v)
|
||||
-> Some(v)
|
||||
| _ -> None
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Initialisation and fixup actions
|
||||
|
||||
Target.create "Init" <| fun _ ->
|
||||
Fake.IO.File.delete (__SOURCE_DIRECTORY__ @@ ".paket/Paket.Restore.Targets")
|
||||
Fake.IO.Directory.delete (__SOURCE_DIRECTORY__ @@ "packet_files")
|
||||
|
||||
Target.create "KillCreated" <| fun _ ->
|
||||
Fake.Core.Process.killAllCreatedProcesses()
|
||||
|
||||
Target.create "KillZombies" <| fun _ ->
|
||||
Fake.Core.Process.killAllByName "issie.exe"
|
||||
Fake.Core.Process.killAllByName "node"
|
||||
Fake.Core.Process.killAllByName "dotnet"
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Set configuration mode based on target
|
||||
|
||||
Target.create "ConfigDebug" <| fun _ ->
|
||||
FakeVar.set "configuration" "Debug"
|
||||
|
||||
Target.create "ConfigRelease" <| fun _ ->
|
||||
FakeVar.set "configuration" "Release"
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Generate assembly info files with the right version & up-to-date information
|
||||
|
||||
Target.create "AssemblyInfo" <| fun _ ->
|
||||
let getAssemblyInfoAttributes projectName =
|
||||
[ AssemblyInfo.Title (projectName)
|
||||
AssemblyInfo.Product project
|
||||
AssemblyInfo.Description summary
|
||||
AssemblyInfo.Version release.AssemblyVersion
|
||||
AssemblyInfo.FileVersion release.AssemblyVersion
|
||||
AssemblyInfo.Configuration <| configuration()
|
||||
AssemblyInfo.InternalsVisibleTo (sprintf "%s.Tests" projectName) ]
|
||||
|
||||
let getProjectDetails projectPath =
|
||||
let projectName = Path.GetFileNameWithoutExtension(projectPath)
|
||||
( projectPath,
|
||||
projectName,
|
||||
Path.GetDirectoryName(projectPath),
|
||||
(getAssemblyInfoAttributes projectName)
|
||||
)
|
||||
|
||||
!! srcGlob
|
||||
|> Seq.map getProjectDetails
|
||||
|> Seq.iter (fun (projFileName, _, folderName, attributes) ->
|
||||
match projFileName with
|
||||
| Fsproj -> AssemblyInfoFile.createFSharp (folderName </> "AssemblyInfo.fs") attributes
|
||||
| Csproj -> AssemblyInfoFile.createCSharp ((folderName </> "Properties") </> "AssemblyInfo.cs") attributes
|
||||
| Vbproj -> AssemblyInfoFile.createVisualBasic ((folderName </> "My Project") </> "AssemblyInfo.vb") attributes
|
||||
| Shproj -> () )
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Update package.json version & name
|
||||
|
||||
Target.create "PackageJson" <| fun _ ->
|
||||
let setValues (current: Json.JsonPackage) =
|
||||
{ current with
|
||||
Name = Str.toKebabCase project |> Some
|
||||
Description = summary |> Some
|
||||
Version = release.NugetVersion |> Some
|
||||
Repository =
|
||||
match current.Repository with
|
||||
| Some(r) ->
|
||||
{ r with
|
||||
Json.RepositoryValue.Type = "git" |> Some
|
||||
Json.RepositoryValue.Url = repo + ".git" |> Some }
|
||||
| _ ->
|
||||
{ Json.RepositoryValue.Type = "git" |> Some
|
||||
Json.RepositoryValue.Url = repo + ".git" |> Some
|
||||
Json.RepositoryValue.Directory = None }
|
||||
|> Some
|
||||
Author = author |> Some
|
||||
License = (File.readLine(__SOURCE_DIRECTORY__ @@ "LICENSE.md").Split(' ')) |> Array.head |> Some
|
||||
Bugs = { Json.BugsValue.Url = (repo + "/issues" |> Some) } |> Some
|
||||
Homepage = repo |> Some }
|
||||
|
||||
Json.setJsonPkg setValues
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Copies binaries from default VS location to expected bin folder
|
||||
// But keeps a subdirectory structure for each project in the
|
||||
// src folder to support multiple project outputs
|
||||
|
||||
Target.create "CopyBinaries" <| fun _ ->
|
||||
!! srcGlob
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/Electron.Fable.fsproj")
|
||||
|> Seq.map (fun f -> ((Path.getDirectory f) @@ "bin" @@ configuration(), "bin" @@ (Path.GetFileNameWithoutExtension f)))
|
||||
|> Seq.iter (fun (fromDir, toDir) -> Shell.copyDir toDir fromDir (fun _ -> true))
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Clean tasks
|
||||
|
||||
Target.create "Clean" <| fun _ ->
|
||||
let clean() =
|
||||
!! (__SOURCE_DIRECTORY__ @@ "tests/**/bin")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "tests/**/obj")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "tools/bin")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "tools/obj")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "src/**/bin")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "src/**/obj")
|
||||
|> Seq.toList
|
||||
|> List.append [bin; temp; objFolder; dist; fable]
|
||||
|> Shell.cleanDirs
|
||||
TaskRunner.runWithRetries clean 99
|
||||
|
||||
Target.create "CleanDocs" <| fun _ ->
|
||||
let clean() =
|
||||
Shell.cleanDirs ["docs"]
|
||||
TaskRunner.runWithRetries clean 99
|
||||
|
||||
Target.create "PostBuildClean" <| fun _ ->
|
||||
let clean() =
|
||||
!! srcGlob
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj")
|
||||
|> Seq.map (
|
||||
(fun f -> (Path.getDirectory f) @@ "bin" @@ configuration())
|
||||
>> (fun f -> Directory.EnumerateDirectories(f) |> Seq.toList )
|
||||
>> (fun fL -> fL |> List.map (fun f -> Directory.EnumerateDirectories(f) |> Seq.toList)))
|
||||
|> (Seq.concat >> Seq.concat)
|
||||
|> Seq.iter Directory.delete
|
||||
TaskRunner.runWithRetries clean 99
|
||||
|
||||
Target.create "PostPublishClean" <| fun _ ->
|
||||
let clean() =
|
||||
!! (__SOURCE_DIRECTORY__ @@ "src/**/bin" @@ configuration() @@ "/**/publish")
|
||||
|> Seq.iter Directory.delete
|
||||
TaskRunner.runWithRetries clean 99
|
||||
|
||||
Target.create "CleanElectronBin" <| fun _ ->
|
||||
let netCores =
|
||||
netCoreVersions
|
||||
|> List.map (fun s -> __SOURCE_DIRECTORY__ @@ "bin/Core" @@ s)
|
||||
|
||||
let clean() =
|
||||
!! (__SOURCE_DIRECTORY__ @@ "bin/Main")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "bin/Renderer")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "bin/Common")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "bin/Simulator")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "bin/WidthInferer")
|
||||
|> List.ofSeq
|
||||
|> Shell.deleteDirs
|
||||
|
||||
let runtimeDirs =
|
||||
runTimes
|
||||
|> List.map (fun s ->
|
||||
netCores
|
||||
|> List.map (fun coreVer -> coreVer @@ s @@ "**"))
|
||||
|> List.concat
|
||||
|
||||
match netCores |> List.tryHead with
|
||||
| Some(h) ->
|
||||
!! (h @@ "**")
|
||||
|> (fun src -> List.fold foldIncludeGlobs src netCores.Tail)
|
||||
|> (fun src -> List.fold foldExcludeGlobs src runtimeDirs)
|
||||
|> Seq.iter Shell.rm
|
||||
| _ -> ()
|
||||
TaskRunner.runWithRetries clean 99
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Restore tasks
|
||||
|
||||
let restoreSolution () =
|
||||
solutionFile
|
||||
|> DotNet.restore id
|
||||
|
||||
Target.create "Restore" <| fun _ ->
|
||||
TaskRunner.runWithRetries restoreSolution 5
|
||||
|
||||
// Add task to make Node.js cli ready
|
||||
Target.create "YarnInstall" <| fun _ ->
|
||||
let setParams (defaults:Yarn.YarnParams) =
|
||||
if Environment.isLinux then
|
||||
defaults
|
||||
else
|
||||
{ defaults with
|
||||
Yarn.YarnParams.YarnFilePath = (__SOURCE_DIRECTORY__ @@ "packages/tooling/Yarnpkg.Yarn/content/bin/yarn.cmd")
|
||||
}
|
||||
Yarn.install setParams
|
||||
|
||||
// Build Key.json if necessary from GD_KEY env variable
|
||||
Target.create "BuildKeys" <| fun _ ->
|
||||
let jsonPath =
|
||||
__SOURCE_DIRECTORY__ @@ "src/Core/Key.json"
|
||||
|> FileInfo.ofPath
|
||||
let key =
|
||||
let insertKey s = sprintf "{ \"key\": \"%s\" }" s
|
||||
|
||||
getEnvFromAllOrNone "GD_KEY"
|
||||
|> Option.map (insertKey)
|
||||
|> defaultArg <| ""
|
||||
TraceSecrets.register "<GD_KEY Json>" key
|
||||
|
||||
if key <> "" && jsonPath.Exists |> not then
|
||||
File.writeString false jsonPath.FullName key
|
||||
else ()
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Build tasks
|
||||
|
||||
Target.create "Build" <| fun _ ->
|
||||
let setParams (defaults:MSBuildParams) =
|
||||
{ defaults with
|
||||
Verbosity = Some(Quiet)
|
||||
Targets = ["Build"]
|
||||
Properties =
|
||||
[
|
||||
"Optimize", "True"
|
||||
"DebugSymbols", "True"
|
||||
"Configuration", configuration()
|
||||
"Version", release.AssemblyVersion
|
||||
"GenerateDocumentationFile", "true"
|
||||
"DependsOnNETStandard", "true"
|
||||
]
|
||||
}
|
||||
restoreSolution()
|
||||
MSBuild.build setParams solutionFile
|
||||
|
||||
Target.create "BuildElectron" <| fun _ ->
|
||||
Npm.exec "rebuild node-sass" id
|
||||
Yarn.exec "compile" id
|
||||
|
||||
// Run Dev mode
|
||||
Target.create "Dev" <| fun _ ->
|
||||
Yarn.exec "dev" id
|
||||
|
||||
// Build artifacts
|
||||
Target.create "DistWin" <| fun _ ->
|
||||
Yarn.exec "distwin" id
|
||||
|
||||
// Build artifacts
|
||||
Target.create "DistMac" <| fun _ ->
|
||||
Yarn.exec "distmac" id
|
||||
|
||||
// Gets latest docker image to build for linux
|
||||
Target.create "PullDockerImage" <| fun _ ->
|
||||
CmdLine.Empty
|
||||
|> CmdLine.append "pull"
|
||||
|> CmdLine.append "electronuserland/builder"
|
||||
|> CmdLine.toString
|
||||
|> CreateProcess.fromRawCommandLine "docker"
|
||||
|> CreateProcess.ensureExitCodeWithMessage "Pulling electronuserland/builder docker container failed."
|
||||
|> Proc.run
|
||||
|> ignore
|
||||
|
||||
// Build artifacts
|
||||
Target.create "DistLinux" <| fun _ ->
|
||||
let sandboxPath = @"./node_modules/electron/dist/chrome-sandbox"
|
||||
|
||||
CmdLine.Empty
|
||||
|> CmdLine.append "run"
|
||||
|> CmdLine.append "--rm"
|
||||
|> CmdLine.appendRaw (sprintf "-v %s:/project" __SOURCE_DIRECTORY__)
|
||||
|> CmdLine.appendRaw "-v electron:/root/.cache/electron"
|
||||
|> CmdLine.appendRaw "-v electron-builder:/root/.cache/electron-builder electronuserland/builder"
|
||||
|> CmdLine.appendRaw (sprintf "/bin/bash -c \"chown -R root %s && chmod 4755 %s && yarn --link-duplicates --pure-lockfile && yarn distLinux\"" sandboxPath sandboxPath)
|
||||
|> CmdLine.toString
|
||||
|> CreateProcess.fromRawCommandLine "docker"
|
||||
|> CreateProcess.ensureExitCodeWithMessage "Failed to build linux image."
|
||||
|> Proc.run
|
||||
|> ignore
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Create differentials for updating
|
||||
|
||||
Target.create "CreateDiffs" <| fun _ ->
|
||||
let latestTag = (Git.CommandHelper.runSimpleGitCommand __SOURCE_DIRECTORY__ "describe --tag").Split('-').[0]
|
||||
let latestRelease =
|
||||
if Version(release.NugetVersion) <= Version(latestTag.Substring(1)) then
|
||||
failwith "Cannot create diff of older version"
|
||||
else
|
||||
sprintf "https://github.com/Shmew/MordhauBuddy/releases/download/%s" latestTag
|
||||
|
||||
let downloadSignature (fi: FileInfo) =
|
||||
let file =
|
||||
match fi.Extension with
|
||||
| ext when ext = ".exe" -> sprintf "MordhauBuddy.Setup.%s%s.sig" (latestTag.Substring(1)) ext
|
||||
| ext when ext = ".AppImage" -> sprintf "MordhauBuddy-%s%s.sig" (latestTag.Substring(1)) ext
|
||||
| _ -> failwith "Invalid file extention for generating delta"
|
||||
|
||||
sprintf "%s/%s" latestRelease file
|
||||
|> downloadFile (fi.Directory.FullName @@ file)
|
||||
|
||||
!! (__SOURCE_DIRECTORY__ @@ "dist/linux-x64/*.AppImage")
|
||||
++ (__SOURCE_DIRECTORY__ @@ "dist/win-x64/*.exe")
|
||||
|> List.ofSeq
|
||||
|> List.distinct
|
||||
|> List.iter (fun f ->
|
||||
let fi = FileInfo.ofPath(f)
|
||||
genSigNew (sprintf "%s.sig" fi.Name) fi
|
||||
|
||||
downloadSignature fi
|
||||
|> FileInfo.ofPath
|
||||
|> genDelta fi)
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Publish net core applications
|
||||
|
||||
Target.create "PublishDotNet" <| fun _ ->
|
||||
let runPublish (project: string) (framework: string) =
|
||||
let buildWithRunTime (rt: string) =
|
||||
let setParams (defaults:MSBuildParams) =
|
||||
{ defaults with
|
||||
Verbosity = Some(Quiet)
|
||||
Targets = ["Publish"]
|
||||
Properties =
|
||||
[
|
||||
"Optimize", "True"
|
||||
"DebugSymbols", "True"
|
||||
"Configuration", configuration()
|
||||
"Version", release.AssemblyVersion
|
||||
"GenerateDocumentationFile", "true"
|
||||
"TargetFramework", framework
|
||||
"SelfContained", "true"
|
||||
"RuntimeIdentifier", rt
|
||||
]
|
||||
}
|
||||
MSBuild.build setParams project
|
||||
runTimes |> List.iter buildWithRunTime
|
||||
|
||||
!! srcGlob
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj")
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.vbproj")
|
||||
|> Seq.map
|
||||
((fun f -> (((Path.getDirectory f) @@ "bin" @@ configuration()), f) )
|
||||
>>
|
||||
(fun f ->
|
||||
Directory.EnumerateDirectories(fst f)
|
||||
|> Seq.filter (fun frFolder -> frFolder.Contains("netcoreapp"))
|
||||
|> Seq.map (fun frFolder -> DirectoryInfo(frFolder).Name), snd f))
|
||||
|> Seq.iter (fun (l,p) -> l |> Seq.iter (runPublish p))
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Lint and format source code to ensure consistency
|
||||
|
||||
Target.create "Format" <| fun _ ->
|
||||
let config =
|
||||
{ FormatConfig.Default with
|
||||
PageWidth = 120
|
||||
SpaceBeforeColon = false }
|
||||
|
||||
fsSrcAndTest
|
||||
|> List.ofSeq
|
||||
|> formatCode config
|
||||
|> Async.RunSynchronously
|
||||
|> printfn "Formatted files: %A"
|
||||
|
||||
Target.create "Lint" <| fun _ ->
|
||||
fsSrcAndTest
|
||||
-- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*")
|
||||
|> (fun src -> List.fold foldExcludeGlobs src relaxedNameLinting)
|
||||
|> (fun fGlob ->
|
||||
match fsRelaxedNameLinting with
|
||||
| Some(glob) ->
|
||||
[(false, fGlob); (true, glob)]
|
||||
| None -> [(false, fGlob)])
|
||||
|> Seq.map (fun (b,glob) -> (b,glob |> List.ofSeq))
|
||||
|> List.ofSeq
|
||||
|> FSharpLinter.lintFiles (__SOURCE_DIRECTORY__ @@ "bin/LintResults.xml")
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Validate JavaScript dependencies
|
||||
|
||||
Target.create "ValidateJSPackages" <| fun _ ->
|
||||
let validate () =
|
||||
fsProjGlob
|
||||
|> Seq.iter (fun file ->
|
||||
dotnet.femto id
|
||||
(sprintf "--resolve %s" file))
|
||||
TaskRunner.runWithRetries validate 5
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Run the unit test binaries
|
||||
|
||||
Target.create "RunTests" <| fun _ ->
|
||||
!! ("tests/**/bin" @@ configuration() @@ "**" @@ "*Tests.exe")
|
||||
|> Seq.iter (fun f ->
|
||||
CreateProcess.fromCommand(setCmd f [])
|
||||
|> CreateProcess.withTimeout (TimeSpan.MaxValue)
|
||||
|> CreateProcess.ensureExitCodeWithMessage "Tests failed."
|
||||
|> Proc.run
|
||||
|> ignore)
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Generate Paket load scripts
|
||||
Target.create "LoadScripts" <| fun _ ->
|
||||
let frameworks =
|
||||
__SOURCE_DIRECTORY__ @@ "bin"
|
||||
|> Directory.EnumerateDirectories
|
||||
|> Seq.map (fun d ->
|
||||
Directory.EnumerateDirectories d
|
||||
|> Seq.map (fun f -> DirectoryInfo(f).Name)
|
||||
|> List.ofSeq)
|
||||
|> List.ofSeq
|
||||
|> List.reduce List.append
|
||||
|> List.distinct
|
||||
|> List.reduce (fun acc elem -> sprintf "%s --framework %s" elem acc)
|
||||
|> function
|
||||
| e when e.Length > 0 ->
|
||||
Some (sprintf "--framework %s" e)
|
||||
| _ -> None
|
||||
|
||||
let arguments =
|
||||
[Some("generate-load-scripts"); frameworks]
|
||||
|> List.choose id
|
||||
|> List.reduce (fun acc elem -> sprintf "%s %s" acc elem)
|
||||
|
||||
arguments
|
||||
|> CreateProcess.fromRawCommandLine ((__SOURCE_DIRECTORY__ @@ ".paket") @@ "paket.exe")
|
||||
|> CreateProcess.withTimeout (TimeSpan.MaxValue)
|
||||
|> CreateProcess.ensureExitCodeWithMessage "Failed to generate paket load scripts."
|
||||
|> Proc.run
|
||||
|> ignore
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Generate the documentation
|
||||
|
||||
|
||||
// Paths with template/source/output locations
|
||||
let content = __SOURCE_DIRECTORY__ @@ "docsrc/content"
|
||||
let output = __SOURCE_DIRECTORY__ @@ "docs"
|
||||
let files = __SOURCE_DIRECTORY__ @@ "docsrc/files"
|
||||
let templates = __SOURCE_DIRECTORY__ @@ "docsrc/tools/templates"
|
||||
let formatting = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting"
|
||||
let toolPath = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting.CommandTool/tools/fsformatting.exe"
|
||||
let docTemplate = "docpage.cshtml"
|
||||
|
||||
Target.create "LocalDocs" <| fun _ ->
|
||||
FakeVar.set "Website" website // for now we never generate local docs
|
||||
Target.create "ReleaseDocs" <| fun _ ->
|
||||
FakeVar.set "Website" website
|
||||
|
||||
// Specify more information about your project
|
||||
let info () =
|
||||
[ "project-name", project
|
||||
"project-author", author
|
||||
"project-summary", summary
|
||||
"project-repo", repo
|
||||
"root", FakeVar.getOrDefault "Website" website ]
|
||||
|
||||
let referenceBinaries = []
|
||||
|
||||
let layoutRootsAll = new Collections.Generic.Dictionary<string, string list>()
|
||||
layoutRootsAll.Add("en",[ templates;
|
||||
formatting @@ "templates"
|
||||
formatting @@ "templates/reference" ])
|
||||
|
||||
Target.create "ReferenceDocs" <| fun _ ->
|
||||
Directory.ensure (output @@ "reference")
|
||||
|
||||
let lDirs =
|
||||
DirectoryInfo.getSubDirectories <| DirectoryInfo bin
|
||||
|> Array.map DirectoryInfo.getSubDirectories
|
||||
|> Array.reduce Array.append
|
||||
|> Array.map (fun x -> x.FullName.ToLower())
|
||||
|> List.ofArray
|
||||
printfn "lDirs=%A" lDirs
|
||||
let binaries () =
|
||||
let manuallyAdded =
|
||||
referenceBinaries
|
||||
|> List.map (fun b -> bin @@ b)
|
||||
|
||||
let conventionBased =
|
||||
DirectoryInfo.getSubDirectories <| DirectoryInfo bin
|
||||
|> Array.collect (fun d ->
|
||||
let name, dInfo =
|
||||
let netFrameworkBin =
|
||||
DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("net4"))
|
||||
let netCoreBin =
|
||||
DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("netcoreapp"))
|
||||
|
||||
match netFrameworkBin.Length > 0 with
|
||||
| true ->
|
||||
d.Name, netFrameworkBin |> Array.head
|
||||
| false ->
|
||||
d.Name, netCoreBin |> Array.head
|
||||
|
||||
dInfo.GetFiles()
|
||||
|> Array.filter (fun x ->
|
||||
x.Name.ToLower() = (sprintf "%s.dll" name).ToLower()
|
||||
|| x.Name.ToLower() = (sprintf "%s.exe" name).ToLower())
|
||||
|> Array.map (fun x -> x.FullName))
|
||||
|> List.ofArray
|
||||
|
||||
conventionBased @ manuallyAdded
|
||||
printfn "Binaries=%A" (binaries())
|
||||
binaries()
|
||||
|> FSFormatting.createDocsForDlls (fun args ->
|
||||
{ args with
|
||||
OutputDirectory = output @@ "reference"
|
||||
LayoutRoots = layoutRootsAll.["en"]
|
||||
ProjectParameters = info()
|
||||
LibDirs = lDirs
|
||||
ToolPath = toolPath
|
||||
SourceRepository = repo @@ "tree/master" })
|
||||
|
||||
let copyFiles () =
|
||||
Shell.copyRecursive files output true
|
||||
|> Trace.logItems "Copying file: "
|
||||
Directory.ensure (output @@ "content")
|
||||
Shell.copyRecursive (formatting @@ "styles") (output @@ "content") true
|
||||
|> Trace.logItems "Copying styles and scripts: "
|
||||
|
||||
Target.create "Docs" <| fun _ ->
|
||||
File.delete "docsrc/content/release-notes.md"
|
||||
Shell.copyFile "docsrc/content/" "RELEASE_NOTES.md"
|
||||
Shell.rename "docsrc/content/release-notes.md" "docsrc/content/RELEASE_NOTES.md"
|
||||
|
||||
DirectoryInfo.getSubDirectories (DirectoryInfo.ofPath templates)
|
||||
|> Seq.iter (fun d ->
|
||||
let name = d.Name
|
||||
if name.Length = 2 || name.Length = 3 then
|
||||
layoutRootsAll.Add(
|
||||
name, [templates @@ name
|
||||
formatting @@ "templates"
|
||||
formatting @@ "templates/reference" ]))
|
||||
copyFiles ()
|
||||
|
||||
for dir in [ content ] do
|
||||
let langSpecificPath(lang, path:string) =
|
||||
path.Split([|'/'; '\\'|], StringSplitOptions.RemoveEmptyEntries)
|
||||
|> Array.exists(fun i -> i = lang)
|
||||
let layoutRoots =
|
||||
let key = layoutRootsAll.Keys |> Seq.tryFind (fun i -> langSpecificPath(i, dir))
|
||||
match key with
|
||||
| Some lang -> layoutRootsAll.[lang]
|
||||
| None -> layoutRootsAll.["en"] // "en" is the default language
|
||||
|
||||
FSFormatting.createDocs (fun args ->
|
||||
{ args with
|
||||
Source = content
|
||||
OutputDirectory = output
|
||||
LayoutRoots = layoutRoots
|
||||
ProjectParameters = info()
|
||||
Template = docTemplate })
|
||||
|
||||
Target.create "GenerateDocs" ignore
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Release Scripts
|
||||
|
||||
Target.create "GitPush" <| fun p ->
|
||||
let msg =
|
||||
p.Context.Arguments
|
||||
|> List.choose (fun s ->
|
||||
match s.StartsWith("--Msg=") with
|
||||
| true -> Some(s.Substring 6)
|
||||
| false -> None)
|
||||
|> List.tryHead
|
||||
|> function
|
||||
| Some(s) -> s
|
||||
| None -> (sprintf "Bump version to %s" release.NugetVersion)
|
||||
|
||||
Git.Staging.stageAll ""
|
||||
Git.Commit.exec "" msg
|
||||
Git.Branches.push ""
|
||||
|
||||
Target.create "GitTag" <| fun _ ->
|
||||
Git.Branches.tag "" release.NugetVersion
|
||||
Git.Branches.pushTag "" "origin" release.NugetVersion
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Run all targets by default. Invoke 'build -t <Target>' to override
|
||||
|
||||
Target.create "All" ignore
|
||||
Target.create "Release" ignore
|
||||
Target.create "UpdateDocs" ignore
|
||||
Target.create "AllDev" ignore
|
||||
Target.create "QDev" <| fun _ ->
|
||||
Yarn.exec "dev" id
|
||||
|
||||
"Clean"
|
||||
==> "AssemblyInfo"
|
||||
==> "Restore"
|
||||
==> "YarnInstall"
|
||||
==> "Build"
|
||||
==> "BuildElectron"
|
||||
==> "PostBuildClean"
|
||||
==> "CopyBinaries"
|
||||
|
||||
"Build" ==> "RunTests"
|
||||
|
||||
"Build"
|
||||
==> "PostBuildClean"
|
||||
==> "PublishDotNet"
|
||||
==> "PostPublishClean"
|
||||
==> "CopyBinaries"
|
||||
|
||||
"Restore" ==> "Lint"
|
||||
"Restore" ==> "Format"
|
||||
|
||||
"Lint"
|
||||
?=> "Build"
|
||||
?=> "RunTests"
|
||||
?=> "CleanDocs"
|
||||
|
||||
"CopyBinaries"
|
||||
==> "CleanDocs"
|
||||
==> "Docs"
|
||||
==> "ReferenceDocs"
|
||||
==> "GenerateDocs"
|
||||
?=> "CleanElectronBin"
|
||||
|
||||
"Clean"
|
||||
==> "GitPush"
|
||||
?=> "GitTag"
|
||||
|
||||
"All" <== [ "CleanElectronBin"]
|
||||
|
||||
"AllDev" <== ["CleanElectronBin"]
|
||||
|
||||
"All" ?=> "Release"
|
||||
|
||||
"LocalDocs" ?=> "All"
|
||||
"ReleaseDocs" ?=> "All"
|
||||
|
||||
"ConfigDebug" ?=> "Clean"
|
||||
"ConfigRelease" ?=> "Clean"
|
||||
|
||||
"PullDockerImage"
|
||||
==> "DistLinux"
|
||||
|
||||
|
||||
"YarnInstall"
|
||||
==> "DistWin"
|
||||
|
||||
|
||||
"DistWin" ?=> "DistLinux"
|
||||
|
||||
"Dev" <== ["All"; "LocalDocs"; "ConfigDebug"]
|
||||
|
||||
"DistWin" <== ["All"; "ConfigRelease"]
|
||||
"DistLinux" <== ["All"; "ConfigRelease"]
|
||||
"Release" <== ["All"; "ConfigRelease"; "DistWin"; "DistLinux"]
|
||||
"UpdateDocs" <== ["All"; "ReleaseDocs"; "ConfigRelease"]
|
||||
|
||||
Target.runOrDefaultWithArguments "Dev"
|
25
build.proj
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project>
|
||||
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
</PropertyGroup>
|
||||
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
|
||||
<PropertyGroup>
|
||||
<RepoRootDir>$([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)"))</RepoRootDir>
|
||||
<BuildDependsOn>
|
||||
</BuildDependsOn>
|
||||
<CoreBuildDependsOn>
|
||||
</CoreBuildDependsOn>
|
||||
</PropertyGroup>
|
||||
<Target Name="Build">
|
||||
<Exec IgnoreStandardErrorWarningFormat="true" Command="fake build" WorkingDirectory="$(RepoRootDir)" />
|
||||
</Target>
|
||||
<Target Name="Pack">
|
||||
</Target>
|
||||
<Target Name="Test">
|
||||
</Target>
|
||||
<Target Name="VSTest" DependsOnTargets="Test" />
|
||||
<Import Project=".paket\Paket.Restore.targets" />
|
||||
</Project>
|
17
build.sh
Executable file
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env bash
|
||||
# to properly set Travis permissions: https://stackoverflow.com/questions/33820638/travis-yml-gradlew-permission-denied
|
||||
# git update-index --chmod=+x fake.sh
|
||||
# git commit -m "permission access for travis"
|
||||
|
||||
set -eu
|
||||
set -o pipefail
|
||||
|
||||
dotnet tool restore
|
||||
dotnet paket install
|
||||
# dotnet restore build.proj
|
||||
|
||||
if [ ! -f build.fsx ]; then
|
||||
dotnet fake run init.fsx
|
||||
fi
|
||||
|
||||
dotnet fake build $@
|
BIN
build/icon.png
Normal file
After Width: | Height: | Size: 63 KiB |
48
docs/Contact.html
Normal file
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>
|
||||
Contact
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Schematic Editor and Simulator" />
|
||||
<meta name="author" content="tomcl" />
|
||||
|
||||
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
|
||||
<link rel="stylesheet" href="content/style.css" />
|
||||
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h><a name="Home" href="index.html"></a></h>
|
||||
<div class="topnav">
|
||||
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
|
||||
<a href="UserGuide.html">User Guide</a>
|
||||
<a href="DeveloperInfo.html">Developer Info</a>
|
||||
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
|
||||
<a href="Contact.html">Contact</a>
|
||||
<div class="topnav-right">
|
||||
<a href="Download.html">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="GeneralText">
|
||||
<div class="section"><h1><a name="General" href="#General">General Issues</a></h1></div>
|
||||
<p>
|
||||
If you encounter any problems using or downloading the software, please see the <a href="https://github.com/tomcl/issie/issues">Gihub Issue</a> page, or <a href="https://github.com/tomcl/issie/issues/new">create a new issue</a> on the ISSIE GitHub repository.
|
||||
Any feedback and suggestions are also welcome!
|
||||
</p><br>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
64
docs/DeveloperInfo.html
Normal file
|
@ -0,0 +1,64 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>
|
||||
Developer Info
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Schematic Editor and Simulator" />
|
||||
<meta name="author" content="tomcl" />
|
||||
|
||||
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
|
||||
<link rel="stylesheet" href="content/style.css" />
|
||||
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h><a name="Home" href="index.html"></a></h>
|
||||
<div class="topnav">
|
||||
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
|
||||
<a href="UserGuide.html">User Guide</a>
|
||||
<a href="DeveloperInfo.html">Developer Info</a>
|
||||
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
|
||||
<a href="Contact.html">Contact</a>
|
||||
<div class="topnav-right">
|
||||
<a href="Download.html">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="GeneralText">
|
||||
<div class="section"><h1><a name="Background-and-Technical-Details" class="anchor" href="#Background-and-Technical-Details">Background and Technical Details</a></h1></div>
|
||||
<p>
|
||||
Marco's <a href="https://tomcl.github.com/issie/marco-report.pdf">Dissertation</a> or his <a href="https://tomcl.github.com/issie/marco-poster.pdf">Poster</a>.
|
||||
</p><br>
|
||||
|
||||
<div class="section"><h1><a name="Documentation" class="anchor" href="#Documentation">Documentation</a></h1></div>
|
||||
<ul>
|
||||
<li>Issie is designed to be usable without needing a User Manual. Developer information can be found in the
|
||||
Github <a href="https://github.com/tomcl/issie/blob/master/README.md">README</a>.
|
||||
</li>
|
||||
</ul><br>
|
||||
|
||||
|
||||
<div class="section"><h1><a name="Contributing" class="anchor" href="#Contributing">Contributing</a></h1></div>
|
||||
<p>
|
||||
The project is hosted on <a href="https://github.com/tomcl/issie">Github</a> where you can <a href="https://github.com/tomcl/issie/issues">report issues</a>, fork the project and submit pull
|
||||
requests. Please take a look at the <a href="contributing.html">contribution guidelines</a> for more information. Contact <a href="https://www.imperial.ac.uk/people/t.clarke">Tom Clarke</a>
|
||||
for more information about development.
|
||||
</p><br>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
62
docs/Download.html
Normal file
|
@ -0,0 +1,62 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>
|
||||
Download
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Schematic Editor and Simulator" />
|
||||
<meta name="author" content="tomcl" />
|
||||
|
||||
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
|
||||
<link rel="stylesheet" href="content/style.css" />
|
||||
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h><a name="Home" href="index.html"></a></h>
|
||||
<div class="topnav">
|
||||
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
|
||||
<a href="UserGuide.html">User Guide</a>
|
||||
<a href="DeveloperInfo.html">Developer Info</a>
|
||||
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
|
||||
<a href="Contact.html">Contact</a>
|
||||
<div class="topnav-right">
|
||||
<a href="Download.html">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="GeneralText">
|
||||
<div class="section"><h1><a name="Downloadlinks" href="#DownloadLinks">Download Links</a></h1></div>
|
||||
<p>
|
||||
Latest stable release: <a href="https://github.com/tomcl/issie/releases/latest">Click here</a> for the latest GitHub release page, where the latest .zip and .tar file can be found.
|
||||
<br><br>
|
||||
Possibly unstable: <a href="https://github.com/tomcl/issie/zipball/master">Download latest master .zip</a>
|
||||
</p><br>
|
||||
|
||||
<div class="section"><h1><a name="SystemRequirements" href="#SystemRequirements">System Requirements</a></h1></div>
|
||||
<p>
|
||||
Currently no known incompatibilities. Linux users can run the windows .zip file under WINE.
|
||||
See <a href="https://github.com/tomcl/issie/blob/master/README.md#getting-started">Getting Started</a> for information about how to run the binaries.
|
||||
</p><br>
|
||||
|
||||
<div class="section"><h1><a name="ReleaseNotes" href="#ReleaseNotes">Release Notes</a></h1></div>
|
||||
<p>
|
||||
All releases: <a href="https://github.com/tomcl/issie/releases">Click here</a>
|
||||
<br>
|
||||
<br>
|
||||
Latest release notes: <a href="https://github.com/tomcl/issie/releases/latest">Click here</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
85
docs/UserGuide.html
Normal file
|
@ -0,0 +1,85 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>
|
||||
User Guide
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Schematic Editor and Simulator" />
|
||||
<meta name="author" content="tomcl" />
|
||||
|
||||
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
|
||||
<link rel="stylesheet" href="content/style.css" />
|
||||
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<h><a name="Home" href="index.html"></a></h>
|
||||
<div class="topnav">
|
||||
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
|
||||
<a href="UserGuide.html">User Guide</a>
|
||||
<a href="DeveloperInfo.html">Developer Info</a>
|
||||
<a href="Contact.html">Contact</a>
|
||||
<div class="topnav-right">
|
||||
<a href="Download.html">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="GeneralText">
|
||||
|
||||
<div id="toc_container">
|
||||
<p class="toc_title">Contents</p>
|
||||
<ul class="toc_list">
|
||||
<li>
|
||||
<a href="#ProjectInfo">1 Project Info</a>
|
||||
<ul>
|
||||
<li><a href="#CreatingProject">1.1 Creating a project</a></li>
|
||||
<li><a href="#Saving">1.2 Saving a project</a></li>
|
||||
<li><a href="#DesignSheets">1.3 Design sheets</a></li>
|
||||
<li><a href="#Exiting">1.4 Exiting the program</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#Components">2 Components</a>
|
||||
<ul>
|
||||
<li><a href="#Catalogue">2.1 Catalogue</a></li>
|
||||
<li><a href="#AddingComponents">2.2 Adding Components</a></li>
|
||||
<li><a href="#EditingComponents">2.3 Editing Components</a></li>
|
||||
<li><a href="#MovingComponents">2.4 Moving Components</a></li>
|
||||
<li><a href="#DeletingComponents">2.5 Deleting Components</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#Wires">3 Wires</a>
|
||||
<ul>
|
||||
<li><a href="#Auto-routing">3.1 Auto-routing</a></li>
|
||||
<li><a href="#Manual-routing">3.2 Manual-routing</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#WidthInference">4 Width Inference</a></li>
|
||||
<li>
|
||||
<a href="#Simulation">5 Circuit Simulation</a>
|
||||
<ul>
|
||||
<li><a href="#StepSimulation">5.1 Step Simulation</a></li>
|
||||
<li><a href="#WaveformSimulation">5.2 Waveform Simulation</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#Verilog">6 Verilog Output</a></li>
|
||||
<li><a href="#Memory">7 Memory Editor</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
<p>
|
||||
CURRENTLY IN PROGRESS, CHECK BACK SOON!
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
2
docs/blog.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
|
||||
|
62
docs/community.html
Normal file
|
@ -0,0 +1,62 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Community
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content="Schematic editor and Simulator"/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
<h1><a name="Community" class="anchor" href="#Community">Community</a></h1>
|
||||
<p>This presently just has the Announcements page, but more may be added in the future.</p>
|
||||
<h2><a name="Announcements" class="anchor" href="#Announcements">Announcements</a></h2>
|
||||
<p>*</p>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
docs/content/github-blue.png
Normal file
After Width: | Height: | Size: 817 B |
BIN
docs/content/github.png
Normal file
After Width: | Height: | Size: 806 B |
BIN
docs/content/img/circuit.png
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
docs/content/img/circuit/RAMviewer.png
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
docs/content/img/circuit/catalog.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
docs/content/img/circuit/circuitcropped.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
docs/content/img/circuit/dragindicator.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
docs/content/img/circuit/initialcanvas.png
Normal file
After Width: | Height: | Size: 201 KiB |
BIN
docs/content/img/circuit/memoryeditor.png
Normal file
After Width: | Height: | Size: 134 KiB |
BIN
docs/content/img/circuit/propertiesram.png
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
docs/content/img/circuit/propertiestab.png
Normal file
After Width: | Height: | Size: 150 KiB |
BIN
docs/content/img/circuit/randomcircuit.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
docs/content/img/circuit/savebutton.png
Normal file
After Width: | Height: | Size: 144 KiB |
BIN
docs/content/img/circuit/simulation tab.png
Normal file
After Width: | Height: | Size: 151 KiB |
BIN
docs/content/img/circuit/stepsimulation.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
docs/content/img/circuit/waveformsimulation.png
Normal file
After Width: | Height: | Size: 177 KiB |
BIN
docs/content/img/circuit/wavesim.png
Normal file
After Width: | Height: | Size: 196 KiB |
BIN
docs/content/img/circuit/wavesimorder.png
Normal file
After Width: | Height: | Size: 175 KiB |
BIN
docs/content/img/circuit/wavesimramview.png
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
docs/content/img/circuit/wireerror.png
Normal file
After Width: | Height: | Size: 113 KiB |
BIN
docs/content/img/github-blue.png
Normal file
After Width: | Height: | Size: 817 B |
BIN
docs/content/img/github.png
Normal file
After Width: | Height: | Size: 806 B |
BIN
docs/content/img/icon.ico
Normal file
After Width: | Height: | Size: 32 KiB |
394
docs/content/style.css
Normal file
|
@ -0,0 +1,394 @@
|
|||
@import url(https://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono|Open+Sans:400,600,700);
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inconsolata:wght@200;300;400;500;600;700;800;900&display=swap');
|
||||
/* COLOUR THEME */
|
||||
/*
|
||||
Backround (white): #FBFFFE
|
||||
Highlight/secondary background (yellow): #FAA916
|
||||
Highlight (blue): #01ABAA
|
||||
TextColour (off black): #272838
|
||||
*/
|
||||
/*--------------------------------------------------------------------------
|
||||
Formatting for F# code snippets
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* strings --- and stlyes for other string related formats */
|
||||
span.s {
|
||||
color: #E0E268;
|
||||
}
|
||||
/* printf formatters */
|
||||
span.pf { color:#E0C57F; }
|
||||
/* escaped chars */
|
||||
span.e { color:#EA8675; }
|
||||
|
||||
/* identifiers --- and styles for more specific identifier types */
|
||||
span.id { color:#d1d1d1; }
|
||||
/* module */
|
||||
span.m { color:#43AEC6; }
|
||||
/* reference type */
|
||||
span.rt { color:#43AEC6; }
|
||||
/* value type */
|
||||
span.vt { color:#43AEC6; }
|
||||
/* interface */
|
||||
span.if{ color:#43AEC6; }
|
||||
/* type argument */
|
||||
span.ta { color:#43AEC6; }
|
||||
/* disposable */
|
||||
span.d { color:#43AEC6; }
|
||||
/* property */
|
||||
span.prop { color:#43AEC6; }
|
||||
/* punctuation */
|
||||
span.p { color:#43AEC6; }
|
||||
/* function */
|
||||
span.f { color:#e1e1e1; }
|
||||
/* active pattern */
|
||||
span.pat { color:#4ec9b0; }
|
||||
/* union case */
|
||||
span.u { color:#4ec9b0; }
|
||||
/* enumeration */
|
||||
span.e { color:#4ec9b0; }
|
||||
/* keywords */
|
||||
span.k { color:#FAB11D; }
|
||||
/* comment */
|
||||
span.c { color:#808080; }
|
||||
/* operators */
|
||||
span.o { color:#af75c1; }
|
||||
/* numbers */
|
||||
span.n { color:#96C71D; }
|
||||
/* line number */
|
||||
span.l { color:#80b0b0; }
|
||||
/* mutable var or ref cell */
|
||||
span.v { color:#d1d1d1; font-weight: bold; }
|
||||
/* inactive code */
|
||||
span.inactive { color:#808080; }
|
||||
/* preprocessor */
|
||||
span.prep { color:#af75c1; }
|
||||
/* fsi output */
|
||||
span.fsi { color:#808080; }
|
||||
|
||||
/* omitted */
|
||||
span.omitted {
|
||||
background:#3c4e52;
|
||||
border-radius:5px;
|
||||
color:#808080;
|
||||
padding:0px 0px 1px 0px;
|
||||
}
|
||||
/* tool tip */
|
||||
div.tip {
|
||||
background:#475b5f;
|
||||
border-radius:4px;
|
||||
font:11pt 'Droid Sans', arial, sans-serif;
|
||||
padding:6px 8px 6px 8px;
|
||||
display:none;
|
||||
color:#d1d1d1;
|
||||
pointer-events:none;
|
||||
}
|
||||
table.pre pre {
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
border:none;
|
||||
}
|
||||
table.pre, pre.fssnip, pre {
|
||||
line-height:13pt;
|
||||
border:1px solid #d8d8d8;
|
||||
border-collapse:separate;
|
||||
white-space:pre;
|
||||
font: 9pt 'Droid Sans Mono',consolas,monospace;
|
||||
width:90%;
|
||||
margin:10px 20px 20px 20px;
|
||||
background-color:#212d30;
|
||||
padding:10px;
|
||||
border-radius:5px;
|
||||
color:#d1d1d1;
|
||||
max-width: none;
|
||||
}
|
||||
pre.fssnip code {
|
||||
font: 9pt 'Droid Sans Mono',consolas,monospace;
|
||||
}
|
||||
table.pre pre {
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
border-radius:0px;
|
||||
width: 100%;
|
||||
}
|
||||
table.pre td {
|
||||
padding:0px;
|
||||
white-space:normal;
|
||||
margin:0px;
|
||||
}
|
||||
table.pre td.lines {
|
||||
width:30px;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Formatting for page & standard document content
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
body {
|
||||
font-family: 'Inconsolata', 'Helvetica';
|
||||
margin: 0;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
pre {
|
||||
word-wrap: inherit;
|
||||
}
|
||||
|
||||
/* Format the heading - nicer spacing etc. */
|
||||
.masthead {
|
||||
overflow: hidden;
|
||||
}
|
||||
.masthead .muted a {
|
||||
text-decoration:none;
|
||||
color:#999999;
|
||||
}
|
||||
.masthead ul, .masthead li {
|
||||
margin-bottom:0px;
|
||||
}
|
||||
.masthead .nav li {
|
||||
margin-top: 15px;
|
||||
font-size:110%;
|
||||
}
|
||||
.masthead h3 {
|
||||
margin-bottom:5px;
|
||||
font-size:170%;
|
||||
}
|
||||
hr {
|
||||
margin:0px 0px 20px 0px;
|
||||
}
|
||||
|
||||
/* Make table headings and td.title bold */
|
||||
td.title, thead {
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
/* Format the right-side menu */
|
||||
#menu {
|
||||
margin-top:50px;
|
||||
font-size:11pt;
|
||||
padding-left:20px;
|
||||
}
|
||||
|
||||
#menu .nav-header {
|
||||
font-size:12pt;
|
||||
color:#606060;
|
||||
margin-top:20px;
|
||||
}
|
||||
|
||||
#menu li {
|
||||
line-height:25px;
|
||||
}
|
||||
|
||||
/* -------- NAVIGATION BAR STYLE ---------- */
|
||||
|
||||
/* Add a black background color to the top navigation */
|
||||
.topnav {
|
||||
background-color: #FAA916;
|
||||
overflow: hidden;
|
||||
line-height: 20px;
|
||||
vertical-align: middle;
|
||||
font-weight: 600;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* Style the links inside the navigation bar */
|
||||
.topnav a {
|
||||
float: left;
|
||||
margin: 0.5%;
|
||||
padding: 0.75%;
|
||||
color: #272838;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
font-size: 18px;
|
||||
|
||||
}
|
||||
|
||||
/* Change the color of links on hover */
|
||||
.topnav a:hover {
|
||||
border-radius: 5px;
|
||||
background-color: #FBFFFE;
|
||||
color: #272838;
|
||||
}
|
||||
|
||||
/* Right-aligned section inside the top navigation */
|
||||
.topnav-right {
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.topnav-right a {
|
||||
float: right;
|
||||
margin: 0.5%;
|
||||
padding: 0.75%;
|
||||
color: #FBFFFE;
|
||||
background-color: #01ABAA;
|
||||
border: 1px solid #FBFFFE;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
/* -------- PANNEL STYLE ------- */
|
||||
|
||||
.IntroBackground {
|
||||
margin-top: 0.5%;
|
||||
background: url('../content/img/circuit/circuitcropped.png');
|
||||
clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 70%);
|
||||
}
|
||||
|
||||
.IntroLayer {
|
||||
margin-top: 0.5%;
|
||||
background-color: rgba(250, 169, 22, 0.8);
|
||||
clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 70%);
|
||||
}
|
||||
|
||||
/* ------- GENERAL TEXT PARAGRAPH STYLE ------ */
|
||||
.GeneralText {
|
||||
margin: 5%;
|
||||
color: #272838;
|
||||
}
|
||||
|
||||
|
||||
/* -------- TABLE OF CONTENTS STYLE ------- */
|
||||
|
||||
#toc_container {
|
||||
background: rgba(250, 169, 22, 0.65) none repeat scroll 0 0;
|
||||
border: 3px solid #FAA916;
|
||||
display: table;
|
||||
margin-bottom: 1em;
|
||||
padding: 20px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.toc_title {
|
||||
font-weight: 700;
|
||||
text-align: left;
|
||||
color: #272838
|
||||
}
|
||||
|
||||
#toc_container li, #toc_container ul, #toc_container ul li {
|
||||
list-style: outside none none !important;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
|
||||
/* ------ GENERIC IMAGE FORMATTING -------- */
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
text-align: center;
|
||||
width: 50%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
/* ------- CLASSES TO ADD LINES BETWEEN SECTIONS -------- */
|
||||
|
||||
.section {
|
||||
border-bottom: 1px solid #FAA916;
|
||||
}
|
||||
|
||||
#halfwidth {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
|
||||
/* -------- List formatting --------- */
|
||||
|
||||
li{
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
/* Responsive layout - when the screen is less than 700px wide, make the two columns stack on top of each other instead of next to each other */
|
||||
@media screen and (max-width: 700px) {
|
||||
.topnav {
|
||||
flex-direction: column;
|
||||
}
|
||||
.topnav-right {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsive layout - when the screen is less than 400px wide, make the navigation links stack on top of each other instead of next to each other */
|
||||
@media screen and (max-width: 400px) {
|
||||
.topnav-right {
|
||||
float: none;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Change font sizes for headings etc. */
|
||||
#main h1 { font-size: 26pt; margin:10px 0px 15px 0px; font-weight:400; border: 1px solid #272838; border-width: 0 1px;}
|
||||
#main h2 { font-size: 20pt; margin:20px 0px 0px 0px; font-weight:400; border-bottom: 1px solid #272838; }
|
||||
#main h3 { font-size: 14pt; margin:15px 0px 0px 0px; font-weight:600; }
|
||||
#main p { font-size: 11pt; margin:5px 0px 15px 0px; }
|
||||
#main ul { font-size: 11pt; margin-top:10px; }
|
||||
#main li { font-size: 11pt; margin: 5px 0px 5px 0px; }
|
||||
#main strong { font-weight:700; }
|
||||
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Formatting for API reference
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
.type-list .type-name, .module-list .module-name {
|
||||
width:25%;
|
||||
font-weight:bold;
|
||||
}
|
||||
.member-list .member-name {
|
||||
width:35%;
|
||||
}
|
||||
#main .xmldoc h2 {
|
||||
font-size:14pt;
|
||||
margin:10px 0px 0px 0px;
|
||||
}
|
||||
#main .xmldoc h3 {
|
||||
font-size:12pt;
|
||||
margin:10px 0px 0px 0px;
|
||||
}
|
||||
.github-link {
|
||||
float:right;
|
||||
text-decoration:none;
|
||||
}
|
||||
.github-link img {
|
||||
border-style:none;
|
||||
margin-left:10px;
|
||||
}
|
||||
.github-link .hover { display:none; }
|
||||
.github-link:hover .hover { display:block; }
|
||||
.github-link .normal { display: block; }
|
||||
.github-link:hover .normal { display: none; }
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Links
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
h1 a, h1 a:hover, h1 a:focus,
|
||||
h2 a, h2 a:hover, h2 a:focus,
|
||||
h3 a, h3 a:hover, h3 a:focus,
|
||||
h4 a, h4 a:hover, h4 a:focus,
|
||||
h5 a, h5 a:hover, h5 a:focus,
|
||||
h6 a, h6 a:hover, h6 a:focus { color : inherit; text-decoration : inherit; outline:none }
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Additional formatting for the homepage
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#nuget {
|
||||
margin-top:20px;
|
||||
font-size: 11pt;
|
||||
padding:20px;
|
||||
}
|
||||
|
||||
#nuget pre {
|
||||
font-size:11pt;
|
||||
-moz-border-radius: 0px;
|
||||
-webkit-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
background: #404040;
|
||||
border-style:none;
|
||||
color: #e0e0e0;
|
||||
margin-top:15px;
|
||||
}
|
227
docs/content/style_light.css
Normal file
|
@ -0,0 +1,227 @@
|
|||
@import url(https://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono|Open+Sans:400,600,700);
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Formatting for F# code snippets
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/* identifier */
|
||||
span.i { color:#000000; }
|
||||
/* string */
|
||||
span.s { color:#a31515; }
|
||||
/* keywords */
|
||||
span.k { color:#0000ff; }
|
||||
/* comment */
|
||||
span.c { color:#008000; }
|
||||
/* operators */
|
||||
span.o { color:#000000; }
|
||||
/* numbers */
|
||||
span.n { color:#000000; }
|
||||
/* line number */
|
||||
span.l { color:#96c2cd; }
|
||||
/* type or module */
|
||||
span.t { color:#2b91af; }
|
||||
/* function */
|
||||
span.f { color:#0000a0; }
|
||||
/* DU case or active pattern */
|
||||
span.p { color:#800080; }
|
||||
/* mutable var or ref cell */
|
||||
span.v { color:#000000; font-weight: bold; }
|
||||
/* printf formatters */
|
||||
span.pf { color:#2b91af; }
|
||||
/* escaped chars */
|
||||
span.e { color:#ff0080; }
|
||||
/* mutable var or ref cell */
|
||||
|
||||
|
||||
/* inactive code */
|
||||
span.inactive { color:#808080; }
|
||||
/* preprocessor */
|
||||
span.prep { color:#0000ff; }
|
||||
/* fsi output */
|
||||
span.fsi { color:#808080; }
|
||||
|
||||
/* omitted */
|
||||
span.omitted {
|
||||
background:#3c4e52;
|
||||
border-radius:5px;
|
||||
color:#808080;
|
||||
padding:0px 0px 1px 0px;
|
||||
}
|
||||
/* tool tip */
|
||||
div.tip {
|
||||
background:#e5e5e5;
|
||||
border-radius:4px;
|
||||
font:9pt 'Droid Sans', arial, sans-serif;
|
||||
padding:6px 8px 6px 8px;
|
||||
display:none;
|
||||
color:#000000;
|
||||
pointer-events:none;
|
||||
}
|
||||
table.pre pre {
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
border:none;
|
||||
}
|
||||
table.pre, pre.fssnip, pre {
|
||||
line-height:13pt;
|
||||
border:1px solid #d8d8d8;
|
||||
border-collapse:separate;
|
||||
white-space:pre;
|
||||
font: 10pt consolas,monospace;
|
||||
width:90%;
|
||||
margin:10px 20px 20px 20px;
|
||||
background-color:#fdfdfd;
|
||||
padding:10px;
|
||||
border-radius:5px;
|
||||
color:#000000;
|
||||
max-width: none;
|
||||
}
|
||||
pre.fssnip code {
|
||||
font: 9pt 'Droid Sans Mono',consolas,monospace;
|
||||
}
|
||||
table.pre pre {
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
border-radius:0px;
|
||||
width: 100%;
|
||||
}
|
||||
table.pre td {
|
||||
padding:0px;
|
||||
white-space:normal;
|
||||
margin:0px;
|
||||
}
|
||||
table.pre td.lines {
|
||||
width:30px;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Formatting for page & standard document content
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
body {
|
||||
font-family: 'Open Sans', serif;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
pre {
|
||||
word-wrap: inherit;
|
||||
}
|
||||
|
||||
/* Format the heading - nicer spacing etc. */
|
||||
.masthead {
|
||||
overflow: hidden;
|
||||
}
|
||||
.masthead .muted a {
|
||||
text-decoration:none;
|
||||
color:#999999;
|
||||
}
|
||||
.masthead ul, .masthead li {
|
||||
margin-bottom:0px;
|
||||
}
|
||||
.masthead .nav li {
|
||||
margin-top: 15px;
|
||||
font-size:110%;
|
||||
}
|
||||
.masthead h3 {
|
||||
margin-bottom:5px;
|
||||
font-size:170%;
|
||||
}
|
||||
hr {
|
||||
margin:0px 0px 20px 0px;
|
||||
}
|
||||
|
||||
/* Make table headings and td.title bold */
|
||||
td.title, thead {
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
/* Format the right-side menu */
|
||||
#menu {
|
||||
margin-top:50px;
|
||||
font-size:11pt;
|
||||
padding-left:20px;
|
||||
}
|
||||
|
||||
#menu .nav-header {
|
||||
font-size:12pt;
|
||||
color:#606060;
|
||||
margin-top:20px;
|
||||
}
|
||||
|
||||
#menu li {
|
||||
line-height:25px;
|
||||
}
|
||||
|
||||
/* Change font sizes for headings etc. */
|
||||
#main h1 { font-size: 26pt; margin:10px 0px 15px 0px; font-weight:400; }
|
||||
#main h2 { font-size: 20pt; margin:20px 0px 0px 0px; font-weight:400; }
|
||||
#main h3 { font-size: 14pt; margin:15px 0px 0px 0px; font-weight:600; }
|
||||
#main p { font-size: 11pt; margin:5px 0px 15px 0px; }
|
||||
#main ul { font-size: 11pt; margin-top:10px; }
|
||||
#main li { font-size: 11pt; margin: 5px 0px 5px 0px; }
|
||||
#main strong { font-weight:700; }
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Formatting for API reference
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
.type-list .type-name, .module-list .module-name {
|
||||
width:25%;
|
||||
font-weight:bold;
|
||||
}
|
||||
.member-list .member-name {
|
||||
width:35%;
|
||||
}
|
||||
#main .xmldoc h2 {
|
||||
font-size:14pt;
|
||||
margin:10px 0px 0px 0px;
|
||||
}
|
||||
#main .xmldoc h3 {
|
||||
font-size:12pt;
|
||||
margin:10px 0px 0px 0px;
|
||||
}
|
||||
.github-link {
|
||||
float:right;
|
||||
text-decoration:none;
|
||||
}
|
||||
.github-link img {
|
||||
border-style:none;
|
||||
margin-left:10px;
|
||||
}
|
||||
.github-link .hover { display:none; }
|
||||
.github-link:hover .hover { display:block; }
|
||||
.github-link .normal { display: block; }
|
||||
.github-link:hover .normal { display: none; }
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Links
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
h1 a, h1 a:hover, h1 a:focus,
|
||||
h2 a, h2 a:hover, h2 a:focus,
|
||||
h3 a, h3 a:hover, h3 a:focus,
|
||||
h4 a, h4 a:hover, h4 a:focus,
|
||||
h5 a, h5 a:hover, h5 a:focus,
|
||||
h6 a, h6 a:hover, h6 a:focus { color : inherit; text-decoration : inherit; outline:none }
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Additional formatting for the homepage
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#nuget {
|
||||
margin-top:20px;
|
||||
font-size: 11pt;
|
||||
padding:20px;
|
||||
}
|
||||
|
||||
#nuget pre {
|
||||
font-size:11pt;
|
||||
-moz-border-radius: 0px;
|
||||
-webkit-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
background: #404040;
|
||||
border-style:none;
|
||||
color: #e0e0e0;
|
||||
margin-top:15px;
|
||||
}
|
46
docs/content/tips.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
var currentTip = null;
|
||||
var currentTipElement = null;
|
||||
|
||||
function hideTip(evt, name, unique) {
|
||||
var el = document.getElementById(name);
|
||||
el.style.display = "none";
|
||||
currentTip = null;
|
||||
}
|
||||
|
||||
function findPos(obj) {
|
||||
// no idea why, but it behaves differently in webbrowser component
|
||||
if (window.location.search == "?inapp")
|
||||
return [obj.offsetLeft + 10, obj.offsetTop + 30];
|
||||
|
||||
var curleft = 0;
|
||||
var curtop = obj.offsetHeight;
|
||||
while (obj) {
|
||||
curleft += obj.offsetLeft;
|
||||
curtop += obj.offsetTop;
|
||||
obj = obj.offsetParent;
|
||||
};
|
||||
return [curleft, curtop];
|
||||
}
|
||||
|
||||
function hideUsingEsc(e) {
|
||||
if (!e) { e = event; }
|
||||
hideTip(e, currentTipElement, currentTip);
|
||||
}
|
||||
|
||||
function showTip(evt, name, unique, owner) {
|
||||
document.onkeydown = hideUsingEsc;
|
||||
if (currentTip == unique) return;
|
||||
currentTip = unique;
|
||||
currentTipElement = name;
|
||||
|
||||
var pos = findPos(owner ? owner : (evt.srcElement ? evt.srcElement : evt.target));
|
||||
var posx = pos[0];
|
||||
var posy = pos[1];
|
||||
|
||||
var el = document.getElementById(name);
|
||||
var parent = (document.documentElement == null) ? document.body : document.documentElement;
|
||||
el.style.position = "absolute";
|
||||
el.style.left = posx + "px";
|
||||
el.style.top = posy + "px";
|
||||
el.style.display = "block";
|
||||
}
|
116
docs/contributing.html
Normal file
|
@ -0,0 +1,116 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Contributing
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content="Schematic editor and Simulator"/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
<h1><a name="Contributing" class="anchor" href="#Contributing">Contributing</a></h1>
|
||||
<h2><a name="Branching" class="anchor" href="#Branching">Branching</a></h2>
|
||||
<ul>
|
||||
<li>Create a feature branch in git.</li>
|
||||
<li>Fork and clone locally.</li>
|
||||
</ul>
|
||||
<h2><a name="Style-Guidelines" class="anchor" href="#Style-Guidelines">Style Guidelines</a></h2>
|
||||
<ul>
|
||||
<li>Follow <a href="https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting">F# Coding Guidelines</a>.</li>
|
||||
<li>Take into consideration <a href="https://github.com/fsprojects/FSharpLint">FSharpLint</a> output.</li>
|
||||
<li><a href="https://github.com/fsprojects/fantomas">Fantomas</a> should be run to ensure formatting is consistent.</li>
|
||||
</ul>
|
||||
<h2><a name="Testing" class="anchor" href="#Testing">Testing</a></h2>
|
||||
<p>Testing is done in the tests libraries using <a href="https://github.com/haf/expecto">Expecto</a> which is able to load in any
|
||||
testing framework you may need, but is strongly encouraged to keep things consistent and use Expecto tests and <a href="https://github.com/fscheck/FsCheck">FsCheck</a>
|
||||
for any property-based testing.</p>
|
||||
<ul>
|
||||
<li>Add test cases where needed.</li>
|
||||
<li>Tests are run as part of the build process, please ensure they pass.</li>
|
||||
<li>Note that pure F# should be tested - GUI cannot easily be tested.</li>
|
||||
</ul>
|
||||
<h2><a name="Documentation" class="anchor" href="#Documentation">Documentation</a></h2>
|
||||
<p>Documentation is built dynamically from F# script files and markdown files using <a href="https://github.com/fsprojects/FSharp.Formatting">FSharp.Formatting</a>.
|
||||
The Reference documentation is dynamically generated, and descriptions specified by using <code>///</code> rather than <code>//</code> for comments, see the Formatting documentation
|
||||
for more information.</p>
|
||||
<ul>
|
||||
<li>Add documentation as necessary, pages can be modified and created in the <code>./docsrc</code> directory.</li>
|
||||
<li>Documentation is built during the build process.</li>
|
||||
<li>Consider adding examples if adding new features.</li>
|
||||
<li><a href="https://daringfireball.net/projects/markdown/syntax">Markdown Syntax</a></li>
|
||||
</ul>
|
||||
<h2><a name="Building" class="anchor" href="#Building">Building</a></h2>
|
||||
<ul>
|
||||
<li>Build the solution with Visual Studio, <code>build.cmd</code> or <code>build.sh</code>.</li>
|
||||
<li>All binaries will be in <code>./bin</code> after being built.</li>
|
||||
<li>
|
||||
When you're ready to commit the code use `build.cmd/sh -t "Release". This will clean up directories, stage,
|
||||
and build everything for release. Once you've confirmed it looks good, commit to your branch and make your PR.
|
||||
</li>
|
||||
<li>Please note in order to build the Linux images you must have <code>Docker</code> installed.</li>
|
||||
</ul>
|
||||
<h2><a name="Releasing" class="anchor" href="#Releasing">Releasing</a></h2>
|
||||
<ul>
|
||||
<li>
|
||||
Create the distributables via the <code>Dist</code> build task, then create the delta and sig files with the <code>CreateDiffs</code> task. Upload all of the files
|
||||
related to the new version to the release.
|
||||
</li>
|
||||
</ul>
|
||||
<div class="row">
|
||||
<div class="span1"></div>
|
||||
<div class="span6">
|
||||
<img src="img/fake.png" alt="Build process"/>
|
||||
</div>
|
||||
</div>
|
||||
<h2><a name="Merging" class="anchor" href="#Merging">Merging</a></h2>
|
||||
<ul>
|
||||
<li>Send a pull request and have it reviewed.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
docs/img/communityAnnouncements.png
Normal file
After Width: | Height: | Size: 189 KiB |
BIN
docs/img/faceToolsActions.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
docs/img/faceToolsProfiles.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
docs/img/fake.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/img/logo-template.pdn
Normal file
BIN
docs/img/logo.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
docs/img/modAvailable.png
Normal file
After Width: | Height: | Size: 384 KiB |
BIN
docs/img/modInstalled.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
docs/img/modInstalling.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/img/mordhauConfig.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
docs/img/settings.png
Normal file
After Width: | Height: | Size: 71 KiB |
198
docs/index.html
Normal file
|
@ -0,0 +1,198 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>
|
||||
ISSIE
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Schematic Editor and Simulator" />
|
||||
<meta name="author" content="tomcl" />
|
||||
|
||||
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
|
||||
<link rel="stylesheet" href="content/style.css" />
|
||||
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h><a name="Home" href="index.html"></a></h>
|
||||
<div class="topnav">
|
||||
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
|
||||
<a href="UserGuide.html">User Guide</a>
|
||||
<a href="DeveloperInfo.html">Developer Info</a>
|
||||
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
|
||||
<a href="Contact.html">Contact</a>
|
||||
<div class="topnav-right">
|
||||
<a href="Download.html">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="IntroBackground">
|
||||
<div class="IntroLayer">
|
||||
<p style="font-size: 24px; margin-left: 0.5%; font-weight:bolder; color: #272838; text-align: center">
|
||||
<br><br><br> Discover, Learn & Create with the ISSIE circuit schematic editor!
|
||||
</p>
|
||||
<div class="topnav-right">
|
||||
<a href="#Info">About ISSIE</a>
|
||||
<a href="#Acknowledgements">Acknowledgements</a>
|
||||
</div>
|
||||
<br><br><br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
<div class="GeneralText">
|
||||
<br><br><br>
|
||||
|
||||
<div class="section"><h1><a name="Info" class="anchor" href="#Info">What is Issie?</a></h1></div>
|
||||
<p>
|
||||
Issie (Interactive Schematic Simulator and Integrated Editor) is a very easy to use and capable hierarchical block schematic based digital logic editor and simulator,
|
||||
originally made for the 1st year undergraduate Digital Electronics and Computer Architecture module at the
|
||||
Department of Electronic and Electrical Engineering, Imperial College London, by 3rd year students at the same institution.
|
||||
</p>
|
||||
<p>
|
||||
Issie has been well tested on designs with up to 15,000 schematic components. We expect it to be reasonably performant on much larger designs as well.
|
||||
The simulation speed is approximately 2000 component-clocks per ms. Thus a circuit with 1000 components would run at 2000 clocks per second. Issie
|
||||
creates fully synchronous circuits with a single clock: logic with asynchronous loops is currently not supported.
|
||||
</p>
|
||||
<p>
|
||||
Issie is coded in F# transpiled to Javascript by <a href="http://fable.io">FABLE</a>, and uses a pure F# drawing library.
|
||||
</p><br>
|
||||
|
||||
<div class="section"><h1><a name="Features" class="anchor" href="#Features">Key Features</a></h1></div>
|
||||
<br>
|
||||
<div id="toc_container">
|
||||
<p class="toc_title">Contents</p>
|
||||
<ul class="toc_list">
|
||||
<li><a href="#ComponentLibrary">1 Component Library</a></li>
|
||||
<li><a href="#WireRouting">2 Wire Routing</a></li>
|
||||
<li><a href="#WidthInference">3 Width Inference</a></li>
|
||||
<li>
|
||||
<a href="#Simulation">4 Circuit Simulation</a>
|
||||
<ul>
|
||||
<li><a href="#StepSimulation">4.1 Step Simulation</a></li>
|
||||
<li><a href="#WaveformSimulation">4.2 Waveform Simulation</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#Verilog">5 Verilog Output</a></li>
|
||||
<li><a href="#Memory">6 Memory Editor</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="section" id="halfwidth"><h2><a name="ComponentLibrary" class="anchor" href="#ComponentLibrary">Component Library</a></h2></div>
|
||||
<p>
|
||||
ISSIE has an extensive and complete library of components available in the 'Catalogue' menu.
|
||||
Components include low-level gates and flipflops as
|
||||
well as larger blocks: RAMs, ROMs, n-bit registers and adders. The lack of HDL-based combinational logic is partly filled by
|
||||
special components: Bus Select (extracts a bit-field), Bus Compare (decodes a min-term of a bus). Components defined as Verilog
|
||||
combinational logic are a likely future addition.
|
||||
</p><br>
|
||||
<p>
|
||||
Viewer components are used to (optionally) view simulation waveforms of nodes on subsheets. Wire label components allow any number of
|
||||
nodes on one design sheet to be connected without visible wires.
|
||||
</p><br>
|
||||
<div class="img">
|
||||
<img src="content/img/circuit/catalog.png" alt="Initial circuit and Component tab" />
|
||||
</div><br>
|
||||
|
||||
<div class="section" id="halfwidth"><h2><a name="WireRouting" class="anchor" href="#WireRouting">Wire Routing</a></h2></div>
|
||||
<p>
|
||||
ISSIE schematic component ports are connected using drag-and-drop: each connection represents a wire or bus.
|
||||
ISSIE has two methods of routing wires: Auto-routing and Manual-routing. Wires will all start out as Auto-routed,
|
||||
which means that the wire's path is created automatically by the program. This path will update when moving any connected components.
|
||||
ISSIE also allows for manual routing, where the user may manipulate segments of the wire as desired to make the circuit more readable. Effort has
|
||||
been put into making this functionality intuitive, with automatic reversion to auto-routing when wire topology changes, and auto-routing of
|
||||
endpoints when parts of a wire are manually routed.
|
||||
</p><br>
|
||||
|
||||
|
||||
<div class="section" id="halfwidth"><h2><a name="WidthInference" class="anchor" href="#WidthInference">Width Inference</a></h2></div>
|
||||
<p>
|
||||
Wires will automatically be created the correct width using a width inference algorithm.
|
||||
Wires connecting two ports of incompatible widths will be highlighted red and an error message shown, as will multiply driven wires.
|
||||
Additional sanity checks (e.g. for combinational loops, or unconnected ports) are made before simulation with errors highlighted visually.
|
||||
</p><br>
|
||||
<div class="img">
|
||||
<img src="content/img/circuit/wireerror.png" alt="Width Inferer Error Message" />
|
||||
</div><br>
|
||||
|
||||
|
||||
<div class="section" id="halfwidth"><h2><a name="CircuitSimulation" class="anchor" href="#CircuitSimulation">Circuit Simulation</a></h2></div>
|
||||
<p>
|
||||
ISSIE includes two simulations in order to inspect and test circuit schematics: The step simulator, and waveform simulator.
|
||||
This allows users to visualise the information in different ways to best suit their needs and understanding.
|
||||
</p><br>
|
||||
|
||||
|
||||
<div class="section" id="halfwidth"><h3><a name="StepSimulation" class="anchor" href="#StepSimulation">Step Simulation</a></h3></div>
|
||||
<p>
|
||||
Step Simulation allows the user to 'step' or cycle through each clock tick, and view the current design sheet's Output and Viewer component information.
|
||||
It also allows users to view how the state changes in stateful components such as RAM.
|
||||
</p><br>
|
||||
<div class="img">
|
||||
<img src="content/img/circuit/simulation tab.png" alt="Step simulator example" />
|
||||
</div><br>
|
||||
|
||||
|
||||
<div class="section" id="halfwidth"><h3><a name="WaveformSimulation" class="anchor" href="#WaveformSimulation">Waveform Simulation</a></h3></div>
|
||||
<p>
|
||||
Waveform Simulation allows the user to see the values in each selected connected circuit element (<a href="https://en.wikipedia.org/wiki/Netlist">Netlist</a>) over time as a waveform.
|
||||
The waveform simulator allows users to move waveforms up/down in the list to make the simulation more readable.
|
||||
Users may cycle through the simulator using the arrows to directly go to a specific clock cycle.
|
||||
Alternatively there is a scrollbar for the Waveform simulator that will automatically lengthen the simulation once the end is reached.
|
||||
The values in the waveform simulator can be viewed in various formats: binary, hexadecimal, unsigned decimal and signed decimal.
|
||||
The Waveform Simulator also features a draggable sidebar to partition screen space dynamically between waveforms and circuit.
|
||||
</p><br>
|
||||
<div class="img">
|
||||
<img src="content/img/circuit/waveformsimulation.png" alt="Waveform simulator example" />
|
||||
</div><br>
|
||||
|
||||
<p>
|
||||
Waveform Simulation also allows for the simulation and contents viewing of memory components such as RAM.
|
||||
</p><br>
|
||||
|
||||
<div class="img">
|
||||
<img src="content/img/circuit/wavesimramview.png" alt="Waveform simulator with RAM example" />
|
||||
</div><br>
|
||||
|
||||
|
||||
|
||||
<div class="section" id="halfwidth"><h2><a name="Verilog" class="anchor" href="#Verilog">Verilog Output</a></h2></div>
|
||||
<p>
|
||||
Users may convert their ISSIE schematic design into a Verilog file using the 'Write design as verilog' option found in the header bar of the application.
|
||||
This allows great flexibility as ISSIE designs may be used in more complex design tools and other programs that use Verilog;
|
||||
allowing ISSIE to be used as a top-level design that can be further developed if needed. Verilog output for simulation or synthesis is documented
|
||||
as part of the Verilog write process, this includes links to a [YoSys](http://bygone.clairexen.net/yosys/download.html) workflow for synthesis on FPGAs.
|
||||
Imperial College users can download a pre-installed VM for this workflow, the VHDL output is standalone and should work with other synthesis methods.
|
||||
</p><br>
|
||||
|
||||
<div class="section" id="halfwidth"><h2><a name="Memory" class="anchor" href="#Memory">Memory Editor</a></h2></div>
|
||||
<p>
|
||||
ISSIE allows users to directly edit the contents of Memory components, for more versitility and ease of use. Memory contents can also be exported and imported via .ram files.
|
||||
</p><br>
|
||||
<div class="img">
|
||||
<img src="content/img/circuit/memoryeditor.png" alt="RAM editor example" />
|
||||
</div><br>
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
<div class="section"><h1><a name="Acknowledgements" class="anchor" href="#Acknowledgements">Acknowledgements:</a></h1></div>
|
||||
<ul>
|
||||
<li>Marco Selvatici for the 8K lines of base code written for his 3rd year BEng <a href="https://github.com/MarcoSelvatici/DEflow">FYP</a></li>
|
||||
<li>Edoardo Santi for work improving Issie over Summer 2020.</li>
|
||||
<li>High Level Programming 2020 cohort for providing the base code of the draw block</li>
|
||||
<li>Jo Merrick for work improving ISSIE for her 3rd year BEng Project</li>
|
||||
<li>Dr Tom Clarke for his continued work maintaining and improving ISSIE throughout</li>
|
||||
<li>All 2020/2021 1st year undergraduate students of the EEE department, Imperial College London, for acting as unpaid beta-testers!</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
BIN
docs/marco-poster.pdf
Normal file
BIN
docs/marco-report.pdf
Normal file
93
docs/reference/bustypes-componentid.html
Normal file
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>ComponentId - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>ComponentId</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '369', 369)" onmouseover="showTip(event, '369', 369)">
|
||||
ComponentId(string)
|
||||
</code>
|
||||
<div class="tip" id="369">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L4-4" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
93
docs/reference/bustypes-connectionid.html
Normal file
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>ConnectionId - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>ConnectionId</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '370', 370)" onmouseover="showTip(event, '370', 370)">
|
||||
ConnectionId(string)
|
||||
</code>
|
||||
<div class="tip" id="370">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L5-5" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
120
docs/reference/bustypes-connectionswidth.html
Normal file
|
@ -0,0 +1,120 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>ConnectionsWidth - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>ConnectionsWidth</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Instance members</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Instance member</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '371', 371)" onmouseover="showTip(event, '371', 371)">
|
||||
x.Count
|
||||
</code>
|
||||
<div class="tip" id="371">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
|
||||
<p>CompiledName: <code>get_Count</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '372', 372)" onmouseover="showTip(event, '372', 372)">
|
||||
x.IsEmpty
|
||||
</code>
|
||||
<div class="tip" id="372">
|
||||
<strong>Signature:</strong> bool<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
|
||||
<p>CompiledName: <code>get_IsEmpty</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '373', 373)" onmouseover="showTip(event, '373', 373)">
|
||||
[key]
|
||||
</code>
|
||||
<div class="tip" id="373">
|
||||
<strong>Signature:</strong> key:ConnectionId -> int option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
|
||||
<p>CompiledName: <code>get_Item</code></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
93
docs/reference/bustypes-inputportid.html
Normal file
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>InputPortId - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>InputPortId</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '374', 374)" onmouseover="showTip(event, '374', 374)">
|
||||
InputPortId(string)
|
||||
</code>
|
||||
<div class="tip" id="374">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L6-6" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
93
docs/reference/bustypes-inputportnumber.html
Normal file
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>InputPortNumber - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>InputPortNumber</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '375', 375)" onmouseover="showTip(event, '375', 375)">
|
||||
InputPortNumber(int)
|
||||
</code>
|
||||
<div class="tip" id="375">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L8-8" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
93
docs/reference/bustypes-outputportid.html
Normal file
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>OutputPortId - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>OutputPortId</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '376', 376)" onmouseover="showTip(event, '376', 376)">
|
||||
OutputPortId(string)
|
||||
</code>
|
||||
<div class="tip" id="376">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L7-7" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
93
docs/reference/bustypes-outputportnumber.html
Normal file
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>OutputPortNumber - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>OutputPortNumber</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '377', 377)" onmouseover="showTip(event, '377', 377)">
|
||||
OutputPortNumber(int)
|
||||
</code>
|
||||
<div class="tip" id="377">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L9-9" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
111
docs/reference/bustypes-widthinfererror.html
Normal file
|
@ -0,0 +1,111 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>WidthInferError - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>WidthInferError</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '378', 378)" onmouseover="showTip(event, '378', 378)">
|
||||
ConnectionsAffected
|
||||
</code>
|
||||
<div class="tip" id="378">
|
||||
<strong>Signature:</strong> ConnectionId list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L16-16" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '379', 379)" onmouseover="showTip(event, '379', 379)">
|
||||
Msg
|
||||
</code>
|
||||
<div class="tip" id="379">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L15-15" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
105
docs/reference/commontypes-canvasstate.html
Normal file
|
@ -0,0 +1,105 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CanvasState - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>CanvasState</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>F# data describing the contents of a single schematic sheet.</p>
|
||||
|
||||
</div>
|
||||
<h3>Instance members</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Instance member</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '104', 104)" onmouseover="showTip(event, '104', 104)">
|
||||
x.Item1
|
||||
</code>
|
||||
<div class="tip" id="104">
|
||||
<strong>Signature:</strong> Component list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '105', 105)" onmouseover="showTip(event, '105', 105)">
|
||||
x.Item2
|
||||
</code>
|
||||
<div class="tip" id="105">
|
||||
<strong>Signature:</strong> Connection list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
241
docs/reference/commontypes-component.html
Normal file
|
@ -0,0 +1,241 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Component - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Component</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>JSComponent mapped to F# record.
|
||||
Id uniquely identifies the component within a sheet and is used by draw2d library.
|
||||
Label is optional descriptor displayed on schematic.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '106', 106)" onmouseover="showTip(event, '106', 106)">
|
||||
H
|
||||
</code>
|
||||
<div class="tip" id="106">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L80-80" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '107', 107)" onmouseover="showTip(event, '107', 107)">
|
||||
Id
|
||||
</code>
|
||||
<div class="tip" id="107">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L73-73" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '108', 108)" onmouseover="showTip(event, '108', 108)">
|
||||
InputPorts
|
||||
</code>
|
||||
<div class="tip" id="108">
|
||||
<strong>Signature:</strong> Port list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L76-76" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '109', 109)" onmouseover="showTip(event, '109', 109)">
|
||||
Label
|
||||
</code>
|
||||
<div class="tip" id="109">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L75-75" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '110', 110)" onmouseover="showTip(event, '110', 110)">
|
||||
OutputPorts
|
||||
</code>
|
||||
<div class="tip" id="110">
|
||||
<strong>Signature:</strong> Port list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L77-77" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '111', 111)" onmouseover="showTip(event, '111', 111)">
|
||||
Type
|
||||
</code>
|
||||
<div class="tip" id="111">
|
||||
<strong>Signature:</strong> ComponentType<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L74-74" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '112', 112)" onmouseover="showTip(event, '112', 112)">
|
||||
W
|
||||
</code>
|
||||
<div class="tip" id="112">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L81-81" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '113', 113)" onmouseover="showTip(event, '113', 113)">
|
||||
X
|
||||
</code>
|
||||
<div class="tip" id="113">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L78-78" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '114', 114)" onmouseover="showTip(event, '114', 114)">
|
||||
Y
|
||||
</code>
|
||||
<div class="tip" id="114">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L79-79" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
507
docs/reference/commontypes-componenttype.html
Normal file
|
@ -0,0 +1,507 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>ComponentType - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>ComponentType</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '115', 115)" onmouseover="showTip(event, '115', 115)">
|
||||
And
|
||||
</code>
|
||||
<div class="tip" id="115">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '116', 116)" onmouseover="showTip(event, '116', 116)">
|
||||
AsyncROM(Memory)
|
||||
</code>
|
||||
<div class="tip" id="116">
|
||||
<strong>Signature:</strong> Memory<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L67-67" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '117', 117)" onmouseover="showTip(event, '117', 117)">
|
||||
BusSelection(OutputWidth,OutputLSBit)
|
||||
</code>
|
||||
<div class="tip" id="117">
|
||||
<strong>Signature:</strong> int * int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '118', 118)" onmouseover="showTip(event, '118', 118)">
|
||||
Custom(CustomComponentType)
|
||||
</code>
|
||||
<div class="tip" id="118">
|
||||
<strong>Signature:</strong> CustomComponentType<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L62-62" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '119', 119)" onmouseover="showTip(event, '119', 119)">
|
||||
Demux2
|
||||
</code>
|
||||
<div class="tip" id="119">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L60-60" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '120', 120)" onmouseover="showTip(event, '120', 120)">
|
||||
DFF
|
||||
</code>
|
||||
<div class="tip" id="120">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '121', 121)" onmouseover="showTip(event, '121', 121)">
|
||||
DFFE
|
||||
</code>
|
||||
<div class="tip" id="121">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '122', 122)" onmouseover="showTip(event, '122', 122)">
|
||||
Input(BusWidth)
|
||||
</code>
|
||||
<div class="tip" id="122">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '123', 123)" onmouseover="showTip(event, '123', 123)">
|
||||
IOLabel
|
||||
</code>
|
||||
<div class="tip" id="123">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '124', 124)" onmouseover="showTip(event, '124', 124)">
|
||||
MergeWires
|
||||
</code>
|
||||
<div class="tip" id="124">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L63-63" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '125', 125)" onmouseover="showTip(event, '125', 125)">
|
||||
Mux2
|
||||
</code>
|
||||
<div class="tip" id="125">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L60-60" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '126', 126)" onmouseover="showTip(event, '126', 126)">
|
||||
Nand
|
||||
</code>
|
||||
<div class="tip" id="126">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '127', 127)" onmouseover="showTip(event, '127', 127)">
|
||||
NbitsAdder(BusWidth)
|
||||
</code>
|
||||
<div class="tip" id="127">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L61-61" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '128', 128)" onmouseover="showTip(event, '128', 128)">
|
||||
Nor
|
||||
</code>
|
||||
<div class="tip" id="128">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '129', 129)" onmouseover="showTip(event, '129', 129)">
|
||||
Not
|
||||
</code>
|
||||
<div class="tip" id="129">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '130', 130)" onmouseover="showTip(event, '130', 130)">
|
||||
Or
|
||||
</code>
|
||||
<div class="tip" id="130">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '131', 131)" onmouseover="showTip(event, '131', 131)">
|
||||
Output(BusWidth)
|
||||
</code>
|
||||
<div class="tip" id="131">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '132', 132)" onmouseover="showTip(event, '132', 132)">
|
||||
RAM(Memory)
|
||||
</code>
|
||||
<div class="tip" id="132">
|
||||
<strong>Signature:</strong> Memory<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L67-67" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '133', 133)" onmouseover="showTip(event, '133', 133)">
|
||||
Register(BusWidth)
|
||||
</code>
|
||||
<div class="tip" id="133">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '134', 134)" onmouseover="showTip(event, '134', 134)">
|
||||
RegisterE(BusWidth)
|
||||
</code>
|
||||
<div class="tip" id="134">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '135', 135)" onmouseover="showTip(event, '135', 135)">
|
||||
ROM(Memory)
|
||||
</code>
|
||||
<div class="tip" id="135">
|
||||
<strong>Signature:</strong> Memory<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L67-67" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '136', 136)" onmouseover="showTip(event, '136', 136)">
|
||||
SplitWire(BusWidth)
|
||||
</code>
|
||||
<div class="tip" id="136">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L63-63" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '137', 137)" onmouseover="showTip(event, '137', 137)">
|
||||
Xnor
|
||||
</code>
|
||||
<div class="tip" id="137">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '138', 138)" onmouseover="showTip(event, '138', 138)">
|
||||
Xor
|
||||
</code>
|
||||
<div class="tip" id="138">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
150
docs/reference/commontypes-connection.html
Normal file
|
@ -0,0 +1,150 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Connection - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Connection</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>JSConnection mapped to F# record.
|
||||
Id uniquely identifies connection globally and is used by library.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '139', 139)" onmouseover="showTip(event, '139', 139)">
|
||||
Id
|
||||
</code>
|
||||
<div class="tip" id="139">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L87-87" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '140', 140)" onmouseover="showTip(event, '140', 140)">
|
||||
Source
|
||||
</code>
|
||||
<div class="tip" id="140">
|
||||
<strong>Signature:</strong> Port<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L88-88" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '141', 141)" onmouseover="showTip(event, '141', 141)">
|
||||
Target
|
||||
</code>
|
||||
<div class="tip" id="141">
|
||||
<strong>Signature:</strong> Port<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L89-89" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '142', 142)" onmouseover="showTip(event, '142', 142)">
|
||||
Vertices
|
||||
</code>
|
||||
<div class="tip" id="142">
|
||||
<strong>Signature:</strong> (float * float) list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L90-90" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
134
docs/reference/commontypes-customcomponenttype.html
Normal file
|
@ -0,0 +1,134 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CustomComponentType - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>CustomComponentType</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>Name identified the LoadedComponent used.
|
||||
The labels define legends on symbol.
|
||||
Label strings are unique per CustomComponent.
|
||||
Multiple CustomComponent instances are differentiated by Component data.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '143', 143)" onmouseover="showTip(event, '143', 143)">
|
||||
InputLabels
|
||||
</code>
|
||||
<div class="tip" id="143">
|
||||
<strong>Signature:</strong> (string * int) list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L39-39" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '144', 144)" onmouseover="showTip(event, '144', 144)">
|
||||
Name
|
||||
</code>
|
||||
<div class="tip" id="144">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L37-37" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '145', 145)" onmouseover="showTip(event, '145', 145)">
|
||||
OutputLabels
|
||||
</code>
|
||||
<div class="tip" id="145">
|
||||
<strong>Signature:</strong> (string * int) list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L40-40" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
179
docs/reference/commontypes-loadedcomponent.html
Normal file
|
@ -0,0 +1,179 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>LoadedComponent - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>LoadedComponent</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>Static data describing a schematic sheet loaded as a custom component.
|
||||
Every sheet is always identified with a file from which it is loaded/saved.
|
||||
Name is human readable (and is the filename - without extension) and identifies sheet.
|
||||
File path is the sheet directory and name (with extension).
|
||||
InputLabels, OutputLabels are the I/O connections.
|
||||
The I/O connection integers are bus widths.
|
||||
The I/O connection strings are human readable. The strings are guaranteed
|
||||
to be unique in the I/O connection list. I.e. An input label may be the same
|
||||
as an output label, but two input (or output) labels cannot be the same.
|
||||
The position in the I/O connections list is important as it implicitly
|
||||
indicates the port number. For example, the first element in the InputLabels
|
||||
list is related to the Component's Port with PortNumber 0.
|
||||
Two instances of a loaded component have the same LoadedComponent data.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '151', 151)" onmouseover="showTip(event, '151', 151)">
|
||||
CanvasState
|
||||
</code>
|
||||
<div class="tip" id="151">
|
||||
<strong>Signature:</strong> CanvasState<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L116-116" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '152', 152)" onmouseover="showTip(event, '152', 152)">
|
||||
FilePath
|
||||
</code>
|
||||
<div class="tip" id="152">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L115-115" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '153', 153)" onmouseover="showTip(event, '153', 153)">
|
||||
InputLabels
|
||||
</code>
|
||||
<div class="tip" id="153">
|
||||
<strong>Signature:</strong> (string * int) list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L117-117" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '154', 154)" onmouseover="showTip(event, '154', 154)">
|
||||
Name
|
||||
</code>
|
||||
<div class="tip" id="154">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L114-114" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '155', 155)" onmouseover="showTip(event, '155', 155)">
|
||||
OutputLabels
|
||||
</code>
|
||||
<div class="tip" id="155">
|
||||
<strong>Signature:</strong> (string * int) list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L118-118" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
129
docs/reference/commontypes-memory.html
Normal file
|
@ -0,0 +1,129 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Memory - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Memory</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '156', 156)" onmouseover="showTip(event, '156', 156)">
|
||||
AddressWidth
|
||||
</code>
|
||||
<div class="tip" id="156">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L46-46" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '157', 157)" onmouseover="showTip(event, '157', 157)">
|
||||
Data
|
||||
</code>
|
||||
<div class="tip" id="157">
|
||||
<strong>Signature:</strong> int64 list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L53-53" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '158', 158)" onmouseover="showTip(event, '158', 158)">
|
||||
WordWidth
|
||||
</code>
|
||||
<div class="tip" id="158">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L48-48" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
147
docs/reference/commontypes-numberbase.html
Normal file
|
@ -0,0 +1,147 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>NumberBase - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>NumberBase</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '159', 159)" onmouseover="showTip(event, '159', 159)">
|
||||
Bin
|
||||
</code>
|
||||
<div class="tip" id="159">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '160', 160)" onmouseover="showTip(event, '160', 160)">
|
||||
Dec
|
||||
</code>
|
||||
<div class="tip" id="160">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '161', 161)" onmouseover="showTip(event, '161', 161)">
|
||||
Hex
|
||||
</code>
|
||||
<div class="tip" id="161">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '162', 162)" onmouseover="showTip(event, '162', 162)">
|
||||
SDec
|
||||
</code>
|
||||
<div class="tip" id="162">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
158
docs/reference/commontypes-port.html
Normal file
|
@ -0,0 +1,158 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Port - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Port</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>A component I/O.
|
||||
Id (like any other Id) is a string generated with 32 random hex charactes,
|
||||
so it is (practically) globally unique. These Ids are used by the draw2d
|
||||
library to uniquely refer to ports and components. They are generated via:
|
||||
<a href="http://www.draw2d.org/draw2d_touch/jsdoc_6/#!/api/draw2d.util.UUID.
|
||||
PortNumber">http://www.draw2d.org/draw2d_touch/jsdoc_6/#!/api/draw2d.util.UUID.
|
||||
PortNumber</a> is used to identify which port on a component, contiguous from 0
|
||||
separately for inputs and outputs.
|
||||
HostId is the unique Id of the component where the port is. For example,
|
||||
all three ports on the same And component will have the same HostId.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '163', 163)" onmouseover="showTip(event, '163', 163)">
|
||||
HostId
|
||||
</code>
|
||||
<div class="tip" id="163">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L29-29" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '164', 164)" onmouseover="showTip(event, '164', 164)">
|
||||
Id
|
||||
</code>
|
||||
<div class="tip" id="164">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L24-24" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '165', 165)" onmouseover="showTip(event, '165', 165)">
|
||||
PortNumber
|
||||
</code>
|
||||
<div class="tip" id="165">
|
||||
<strong>Signature:</strong> int option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L27-27" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '166', 166)" onmouseover="showTip(event, '166', 166)">
|
||||
PortType
|
||||
</code>
|
||||
<div class="tip" id="166">
|
||||
<strong>Signature:</strong> PortType<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L28-28" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
111
docs/reference/commontypes-porttype.html
Normal file
|
@ -0,0 +1,111 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>PortType - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>PortType</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '167', 167)" onmouseover="showTip(event, '167', 167)">
|
||||
Input
|
||||
</code>
|
||||
<div class="tip" id="167">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L12-12" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '168', 168)" onmouseover="showTip(event, '168', 168)">
|
||||
Output
|
||||
</code>
|
||||
<div class="tip" id="168">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L12-12" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
134
docs/reference/commontypes-project.html
Normal file
|
@ -0,0 +1,134 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Project - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Project</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>Type for an open project which represents a complete design.
|
||||
ProjectPath is directory containing project files.
|
||||
OpenFileName is name of file from which current schematic sheet is loaded/saved.
|
||||
LoadedComponents contains the list of schematic sheets, each as a component, one per sheet.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '169', 169)" onmouseover="showTip(event, '169', 169)">
|
||||
LoadedComponents
|
||||
</code>
|
||||
<div class="tip" id="169">
|
||||
<strong>Signature:</strong> LoadedComponent list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L128-128" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '170', 170)" onmouseover="showTip(event, '170', 170)">
|
||||
OpenFileName
|
||||
</code>
|
||||
<div class="tip" id="170">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L127-127" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '171', 171)" onmouseover="showTip(event, '171', 171)">
|
||||
ProjectPath
|
||||
</code>
|
||||
<div class="tip" id="171">
|
||||
<strong>Signature:</strong> string<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L126-126" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
165
docs/reference/diagrammessagetype-jsdiagrammsg.html
Normal file
|
@ -0,0 +1,165 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>JSDiagramMsg - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>JSDiagramMsg</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '178', 178)" onmouseover="showTip(event, '178', 178)">
|
||||
InferWidths(unit)
|
||||
</code>
|
||||
<div class="tip" id="178">
|
||||
<strong>Signature:</strong> unit<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L40-40" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '179', 179)" onmouseover="showTip(event, '179', 179)">
|
||||
InitCanvas(JSCanvas)
|
||||
</code>
|
||||
<div class="tip" id="179">
|
||||
<strong>Signature:</strong> JSCanvas<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L37-37" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '180', 180)" onmouseover="showTip(event, '180', 180)">
|
||||
SelectComponent(JSComponent)
|
||||
</code>
|
||||
<div class="tip" id="180">
|
||||
<strong>Signature:</strong> JSComponent<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L38-38" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '181', 181)" onmouseover="showTip(event, '181', 181)">
|
||||
SetHasUnsavedChanges(bool)
|
||||
</code>
|
||||
<div class="tip" id="181">
|
||||
<strong>Signature:</strong> bool<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L41-41" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '182', 182)" onmouseover="showTip(event, '182', 182)">
|
||||
UnselectComponent(unit)
|
||||
</code>
|
||||
<div class="tip" id="182">
|
||||
<strong>Signature:</strong> unit<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L39-39" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
165
docs/reference/diagrammessagetype-keyboardshortcutmsg.html
Normal file
|
@ -0,0 +1,165 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>KeyboardShortcutMsg - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>KeyboardShortcutMsg</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '183', 183)" onmouseover="showTip(event, '183', 183)">
|
||||
AltC
|
||||
</code>
|
||||
<div class="tip" id="183">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '184', 184)" onmouseover="showTip(event, '184', 184)">
|
||||
AltShiftZ
|
||||
</code>
|
||||
<div class="tip" id="184">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '185', 185)" onmouseover="showTip(event, '185', 185)">
|
||||
AltV
|
||||
</code>
|
||||
<div class="tip" id="185">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '186', 186)" onmouseover="showTip(event, '186', 186)">
|
||||
AltZ
|
||||
</code>
|
||||
<div class="tip" id="186">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '187', 187)" onmouseover="showTip(event, '187', 187)">
|
||||
CtrlS
|
||||
</code>
|
||||
<div class="tip" id="187">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
129
docs/reference/diagrammessagetype-memoryeditordata.html
Normal file
|
@ -0,0 +1,129 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>MemoryEditorData - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>MemoryEditorData</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '188', 188)" onmouseover="showTip(event, '188', 188)">
|
||||
Address
|
||||
</code>
|
||||
<div class="tip" id="188">
|
||||
<strong>Signature:</strong> int option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L16-16" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '189', 189)" onmouseover="showTip(event, '189', 189)">
|
||||
NumberBase
|
||||
</code>
|
||||
<div class="tip" id="189">
|
||||
<strong>Signature:</strong> NumberBase<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L17-17" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '190', 190)" onmouseover="showTip(event, '190', 190)">
|
||||
OnlyDiff
|
||||
</code>
|
||||
<div class="tip" id="190">
|
||||
<strong>Signature:</strong> bool<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L15-15" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
759
docs/reference/diagrammessagetype-msg.html
Normal file
|
@ -0,0 +1,759 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Msg - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>Msg</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '195', 195)" onmouseover="showTip(event, '195', 195)">
|
||||
AddWaveSimFile(string,WaveSimModel)
|
||||
</code>
|
||||
<div class="tip" id="195">
|
||||
<strong>Signature:</strong> string * WaveSimModel<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L118-118" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '196', 196)" onmouseover="showTip(event, '196', 196)">
|
||||
ChangeRightTab(RightTab)
|
||||
</code>
|
||||
<div class="tip" id="196">
|
||||
<strong>Signature:</strong> RightTab<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L123-123" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '197', 197)" onmouseover="showTip(event, '197', 197)">
|
||||
CloseDiagramNotification
|
||||
</code>
|
||||
<div class="tip" id="197">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L136-136" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '198', 198)" onmouseover="showTip(event, '198', 198)">
|
||||
CloseFilesNotification
|
||||
</code>
|
||||
<div class="tip" id="198">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L141-141" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '199', 199)" onmouseover="showTip(event, '199', 199)">
|
||||
CloseMemoryEditorNotification
|
||||
</code>
|
||||
<div class="tip" id="199">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L143-143" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '200', 200)" onmouseover="showTip(event, '200', 200)">
|
||||
ClosePopup
|
||||
</code>
|
||||
<div class="tip" id="200">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L130-130" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '201', 201)" onmouseover="showTip(event, '201', 201)">
|
||||
CloseProject
|
||||
</code>
|
||||
<div class="tip" id="201">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L128-128" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '202', 202)" onmouseover="showTip(event, '202', 202)">
|
||||
ClosePropertiesNotification
|
||||
</code>
|
||||
<div class="tip" id="202">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L145-145" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '203', 203)" onmouseover="showTip(event, '203', 203)">
|
||||
CloseSimulationNotification
|
||||
</code>
|
||||
<div class="tip" id="203">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L138-138" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '204', 204)" onmouseover="showTip(event, '204', 204)">
|
||||
CloseWaveSimNotification
|
||||
</code>
|
||||
<div class="tip" id="204">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L139-139" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '205', 205)" onmouseover="showTip(event, '205', 205)">
|
||||
EndSimulation
|
||||
</code>
|
||||
<div class="tip" id="205">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L122-122" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '206', 206)" onmouseover="showTip(event, '206', 206)">
|
||||
IncrementSimulationClockTick
|
||||
</code>
|
||||
<div class="tip" id="206">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L121-121" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '207', 207)" onmouseover="showTip(event, '207', 207)">
|
||||
JSDiagramMsg(JSDiagramMsg)
|
||||
</code>
|
||||
<div class="tip" id="207">
|
||||
<strong>Signature:</strong> JSDiagramMsg<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L114-114" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '208', 208)" onmouseover="showTip(event, '208', 208)">
|
||||
KeyboardShortcutMsg(KeyboardShortcutMsg)
|
||||
</code>
|
||||
<div class="tip" id="208">
|
||||
<strong>Signature:</strong> KeyboardShortcutMsg<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L115-115" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '209', 209)" onmouseover="showTip(event, '209', 209)">
|
||||
MenuAction(MenuCommand,Msg -> unit)
|
||||
</code>
|
||||
<div class="tip" id="209">
|
||||
<strong>Signature:</strong> MenuCommand * Msg -> unit<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L150-150" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '210', 210)" onmouseover="showTip(event, '210', 210)">
|
||||
ReloadSelectedComponent(int)
|
||||
</code>
|
||||
<div class="tip" id="210">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L147-147" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '211', 211)" onmouseover="showTip(event, '211', 211)">
|
||||
SelectionHasChanged
|
||||
</code>
|
||||
<div class="tip" id="211">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L151-151" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '212', 212)" onmouseover="showTip(event, '212', 212)">
|
||||
SetClipboard(CanvasState)
|
||||
</code>
|
||||
<div class="tip" id="212">
|
||||
<strong>Signature:</strong> CanvasState<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L125-125" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '213', 213)" onmouseover="showTip(event, '213', 213)">
|
||||
SetCreateComponent(Component)
|
||||
</code>
|
||||
<div class="tip" id="213">
|
||||
<strong>Signature:</strong> Component<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L126-126" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '214', 214)" onmouseover="showTip(event, '214', 214)">
|
||||
SetDragMode(DragMode)
|
||||
</code>
|
||||
<div class="tip" id="214">
|
||||
<strong>Signature:</strong> DragMode<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L148-148" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '215', 215)" onmouseover="showTip(event, '215', 215)">
|
||||
SetFilesNotification(...)
|
||||
</code>
|
||||
<div class="tip" id="215">
|
||||
<strong>Signature:</strong> (Msg -> unit) -> (type)<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L140-140" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '216', 216)" onmouseover="showTip(event, '216', 216)">
|
||||
SetHighlighted(...)
|
||||
</code>
|
||||
<div class="tip" id="216">
|
||||
<strong>Signature:</strong> ComponentId list * ConnectionId list<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L124-124" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '217', 217)" onmouseover="showTip(event, '217', 217)">
|
||||
SetMemoryEditorNotification(...)
|
||||
</code>
|
||||
<div class="tip" id="217">
|
||||
<strong>Signature:</strong> (Msg -> unit) -> (type)<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L142-142" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '218', 218)" onmouseover="showTip(event, '218', 218)">
|
||||
SetPopupDialogInt(int option)
|
||||
</code>
|
||||
<div class="tip" id="218">
|
||||
<strong>Signature:</strong> int option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L132-132" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '219', 219)" onmouseover="showTip(event, '219', 219)">
|
||||
SetPopupDialogMemorySetup(...)
|
||||
</code>
|
||||
<div class="tip" id="219">
|
||||
<strong>Signature:</strong> (int * int) option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L134-134" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '220', 220)" onmouseover="showTip(event, '220', 220)">
|
||||
SetPopupDialogText(string option)
|
||||
</code>
|
||||
<div class="tip" id="220">
|
||||
<strong>Signature:</strong> string option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L131-131" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '221', 221)" onmouseover="showTip(event, '221', 221)">
|
||||
SetPopupDialogTwoInts(...)
|
||||
</code>
|
||||
<div class="tip" id="221">
|
||||
<strong>Signature:</strong> int option * IntMode<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L133-133" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '222', 222)" onmouseover="showTip(event, '222', 222)">
|
||||
SetPopupMemoryEditorData(...)
|
||||
</code>
|
||||
<div class="tip" id="222">
|
||||
<strong>Signature:</strong> MemoryEditorData option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L135-135" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '223', 223)" onmouseover="showTip(event, '223', 223)">
|
||||
SetProject(Project)
|
||||
</code>
|
||||
<div class="tip" id="223">
|
||||
<strong>Signature:</strong> Project<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L127-127" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '224', 224)" onmouseover="showTip(event, '224', 224)">
|
||||
SetPropertiesNotification(...)
|
||||
</code>
|
||||
<div class="tip" id="224">
|
||||
<strong>Signature:</strong> (Msg -> unit) -> (type)<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L144-144" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '225', 225)" onmouseover="showTip(event, '225', 225)">
|
||||
SetSimulationBase(NumberBase)
|
||||
</code>
|
||||
<div class="tip" id="225">
|
||||
<strong>Signature:</strong> NumberBase<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L120-120" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '226', 226)" onmouseover="showTip(event, '226', 226)">
|
||||
SetSimulationGraph(SimulationGraph)
|
||||
</code>
|
||||
<div class="tip" id="226">
|
||||
<strong>Signature:</strong> SimulationGraph<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L119-119" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '227', 227)" onmouseover="showTip(event, '227', 227)">
|
||||
SetSimulationNotification(...)
|
||||
</code>
|
||||
<div class="tip" id="227">
|
||||
<strong>Signature:</strong> (Msg -> unit) -> (type)<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L137-137" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '228', 228)" onmouseover="showTip(event, '228', 228)">
|
||||
SetTopMenu(TopMenu)
|
||||
</code>
|
||||
<div class="tip" id="228">
|
||||
<strong>Signature:</strong> TopMenu<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L146-146" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '229', 229)" onmouseover="showTip(event, '229', 229)">
|
||||
SetViewerWidth(int)
|
||||
</code>
|
||||
<div class="tip" id="229">
|
||||
<strong>Signature:</strong> int<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L149-149" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '230', 230)" onmouseover="showTip(event, '230', 230)">
|
||||
ShowPopup(PopupDialogData -> (type))
|
||||
</code>
|
||||
<div class="tip" id="230">
|
||||
<strong>Signature:</strong> PopupDialogData -> (type)<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L129-129" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '231', 231)" onmouseover="showTip(event, '231', 231)">
|
||||
StartSimulation(...)
|
||||
</code>
|
||||
<div class="tip" id="231">
|
||||
<strong>Signature:</strong> Result<SimulationData,SimulationError><br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L116-116" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '232', 232)" onmouseover="showTip(event, '232', 232)">
|
||||
StartWaveSim(...)
|
||||
</code>
|
||||
<div class="tip" id="232">
|
||||
<strong>Signature:</strong> Result<WaveSimModel,SimulationError option><br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L117-117" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
167
docs/reference/diagrammessagetype-popupdialogdata.html
Normal file
|
@ -0,0 +1,167 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>PopupDialogData - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>PopupDialogData</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
<p>Possible fields that may (or may not) be used in a dialog popup.</p>
|
||||
|
||||
</div>
|
||||
<h3>Record Fields</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Record Field</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '233', 233)" onmouseover="showTip(event, '233', 233)">
|
||||
Int
|
||||
</code>
|
||||
<div class="tip" id="233">
|
||||
<strong>Signature:</strong> int option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L23-23" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '234', 234)" onmouseover="showTip(event, '234', 234)">
|
||||
Int2
|
||||
</code>
|
||||
<div class="tip" id="234">
|
||||
<strong>Signature:</strong> int option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L24-24" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '235', 235)" onmouseover="showTip(event, '235', 235)">
|
||||
MemoryEditorData
|
||||
</code>
|
||||
<div class="tip" id="235">
|
||||
<strong>Signature:</strong> MemoryEditorData option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L26-26" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '236', 236)" onmouseover="showTip(event, '236', 236)">
|
||||
MemorySetup
|
||||
</code>
|
||||
<div class="tip" id="236">
|
||||
<strong>Signature:</strong> (int * int) option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L25-25" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '237', 237)" onmouseover="showTip(event, '237', 237)">
|
||||
Text
|
||||
</code>
|
||||
<div class="tip" id="237">
|
||||
<strong>Signature:</strong> string option<br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L22-22" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
147
docs/reference/diagrammessagetype-righttab.html
Normal file
|
@ -0,0 +1,147 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>RightTab - issie</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="description" content=""/>
|
||||
<meta name="author" content="tomcl"/>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
|
||||
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
|
||||
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
|
||||
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
|
||||
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
|
||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="masthead">
|
||||
<ul class="nav nav-pills pull-right">
|
||||
<li><a href="http://fsharp.org">fsharp.org</a></li>
|
||||
</ul>
|
||||
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="span9" id="main">
|
||||
|
||||
|
||||
|
||||
|
||||
<h1>RightTab</h1>
|
||||
<p>
|
||||
|
||||
<span>Namespace: global</span><br />
|
||||
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
|
||||
</p>
|
||||
<div class="xmldoc">
|
||||
</div>
|
||||
<h3>Union Cases</h3>
|
||||
<table class="table table-bordered member-list">
|
||||
<thead>
|
||||
<tr><td>Union Case</td><td>Description</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '238', 238)" onmouseover="showTip(event, '238', 238)">
|
||||
Catalogue
|
||||
</code>
|
||||
<div class="tip" id="238">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L10-10" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '239', 239)" onmouseover="showTip(event, '239', 239)">
|
||||
Properties
|
||||
</code>
|
||||
<div class="tip" id="239">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L9-9" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '240', 240)" onmouseover="showTip(event, '240', 240)">
|
||||
Simulation
|
||||
</code>
|
||||
<div class="tip" id="240">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L11-11" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="member-name">
|
||||
|
||||
<code onmouseout="hideTip(event, '241', 241)" onmouseover="showTip(event, '241', 241)">
|
||||
WaveSim
|
||||
</code>
|
||||
<div class="tip" id="241">
|
||||
<strong>Signature:</strong> <br />
|
||||
</div>
|
||||
</td>
|
||||
<td class="xmldoc">
|
||||
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L12-12" class="github-link">
|
||||
<img src="../content/img/github.png" class="normal" />
|
||||
<img src="../content/img/github-blue.png" class="hover" />
|
||||
</a>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
<div class="span3">
|
||||
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
|
||||
<li class="nav-header">issie</li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
|
||||
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
|
||||
|
||||
<li class="nav-header">Documentation</li>
|
||||
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
|
||||
|
||||
<li class="nav-header">Reference</li>
|
||||
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|