Compare commits

..

No commits in common. "9c332ac3e74bdda12289b8141a5b74c2250cc1e3" and "6ed60a2c261407fe3ae068d922515df470d61558" have entirely different histories.

17 changed files with 121 additions and 175 deletions

View File

@ -5,7 +5,6 @@
#include "error_dialog.h" #include "error_dialog.h"
#include "warning_dialog.h" #include "warning_dialog.h"
#include "message_source.h" #include "message_source.h"
#include <stdexcept>
namespace display { namespace display {
@ -92,7 +91,7 @@ namespace display {
value = domain::Value::fromInt(parseInt(string.toStdString())); value = domain::Value::fromInt(parseInt(string.toStdString()));
break; break;
default: default:
throw std::runtime_error("invalid value type in text change"); throw std::exception();
} }
} }

View File

@ -25,8 +25,8 @@ namespace domain {
std::string name; std::string name;
WireType type; WireType type;
int width; int width;
bool hidden = false; bool hidden;
bool hasTerminate = false; bool hasTerminate;
Value terminateWith; Value terminateWith;
public: public:

View File

@ -128,18 +128,8 @@ namespace domain {
} }
void generateConnection(ConnectionInstance *connection, ostream &buffer) { void generateConnection(ConnectionInstance *connection, ostream &buffer) {
buffer << "\t\tline {x1:" << connection->start.first << "; y1:" << connection->start.second << "; " <<
auto x1 = connection->start.first; "x2:" << connection->end.first << "; y2:" << connection->end.second << ";}" << "\n";
auto y1 = connection->start.second;
auto x2 = connection->end.first;
auto y2 = connection->end.second;
buffer << "\t\tpath {\n";
buffer << "\t\t\tx:0; y:0;\n";
buffer << "\t\t\tpoints: (";
buffer << "(" << x1 << ", " << y1 << "),";
buffer << "(" << (x2 - x1) << "," << (y2 - y1) << "));\n";
buffer << "\t\t}" << std::endl;
} }
void generateBus(BusInstance *bus, ostream &buffer) { void generateBus(BusInstance *bus, ostream &buffer) {
@ -159,9 +149,9 @@ namespace domain {
for (auto &bus: schema->busInstances) { for (auto &bus: schema->busInstances) {
buffer << "\t//" << bus->name << std::endl; buffer << "\t//" << bus->name << std::endl;
for (auto &wire: bus->bus.getWires()) { for (auto &wire: bus->bus.getWires()) {
auto name = wire.getName(); auto name = (wire.isHidden() ? "--" : "") + wire.getName();
if (usedNames.count(name) > 0) { if (usedNames.count(name) > 0) {
name = bus->name + "__" + wire.getName(); name = (wire.isHidden() ? "--" : "") + bus->name + "__" + wire.getName();
} }
usedNames.insert(name); usedNames.insert(name);
usedMappings.insert(std::make_pair(bus->name + "." + wire.getName(), name)); usedMappings.insert(std::make_pair(bus->name + "." + wire.getName(), name));
@ -192,11 +182,7 @@ namespace domain {
if (wire.getWidth() != 1) { if (wire.getWidth() != 1) {
buffer << "<" << wire.getWidth() << ">"; buffer << "<" << wire.getWidth() << ">";
} }
buffer << " " << (wire.isHidden() ? "--" : "") << name; buffer << " " << name << ";" << std::endl;
if(wire.hasTerminateWith()) {
buffer << " = " << wire.getTerminateWith().asInt();
}
buffer << ";" << std::endl;
} }
std::set<std::string> createImports(Schema *schema) { std::set<std::string> createImports(Schema *schema) {

View File

@ -1,5 +1,4 @@
#include "component.h" #include "component.h"
#include <stdexcept>
namespace domain { namespace domain {
@ -58,7 +57,7 @@ namespace domain {
return p; return p;
} }
} }
throw std::runtime_error("no pin with name '" + pin + "'"); throw std::exception();
} }
bool Component::hasPin(std::string name) { bool Component::hasPin(std::string name) {
@ -80,7 +79,7 @@ namespace domain {
return attr; return attr;
} }
} }
throw std::runtime_error("no attribute with name '" + attribute + "'"); throw std::exception();
} }
bool Component::hasAttribute(std::string name, Value::ValueType type) { bool Component::hasAttribute(std::string name, Value::ValueType type) {

View File

@ -1,5 +1,4 @@
#include "connection.h" #include "connection.h"
#include <stdexcept>
namespace domain { namespace domain {
@ -39,7 +38,7 @@ namespace domain {
return attributes[i]; return attributes[i];
} }
} }
throw std::runtime_error("no attribute with name '" + name + "'"); throw std::exception();
} }
bool Connection::hasAttribute(std::string name) { bool Connection::hasAttribute(std::string name) {

View File

@ -1,5 +1,4 @@
#include "connection_instance.h" #include "connection_instance.h"
#include <stdexcept>
namespace domain { namespace domain {
@ -14,7 +13,7 @@ namespace domain {
return attr; return attr;
} }
} }
throw std::runtime_error("no attribute with name '" + attribute + "'"); throw std::exception();
} }

View File

@ -47,9 +47,7 @@ namespace domain {
void ui::Rect::comdel(std::ostream &buffer, int x, int y) { void ui::Rect::comdel(std::ostream &buffer, int x, int y) {
buffer << "\t\trectangle {\n"; buffer << "\t\trectangle {\n";
buffer << "\t\t\tx: " << (this->x + x) << "; y: " << (this->y + y) << ";\n"; buffer << "\t\t\tx: " << (this->x + x) << "; y: " << (this->y + y) << ";\n";
buffer << "\t\t\twidth: " << w << "; height: " << h << ";\n"; buffer << "\t\t\tw: " << w << "; h: " << h << ";\n";
buffer << "\t\t\tfill_color: " << this->config.fillColor.name().toStdString() << ";\n";
buffer << "\t\t\tline_color: " << this->config.lineColor.name().toStdString() << ";\n";
buffer << "\t\t}\n\n"; buffer << "\t\t}\n\n";
} }
@ -63,7 +61,7 @@ namespace domain {
void ui::Ellipse::comdel(std::ostream &buffer, int x, int y) { void ui::Ellipse::comdel(std::ostream &buffer, int x, int y) {
buffer << "\t\tellipse {\n"; buffer << "\t\tellipse {\n";
buffer << "\t\t\tx: " << (this->x + x) << "; y: " << (this->y + y) << ";\n"; buffer << "\t\t\tx: " << (this->x + x) << "; y: " << (this->y + y) << ";\n";
buffer << "\t\t\twidth: " << w << "; height: " << h << ";\n"; buffer << "\t\t\tw: " << w << "; h: " << h << ";\n";
buffer << "\t\t}\n\n"; buffer << "\t\t}\n\n";
} }
@ -75,12 +73,10 @@ namespace domain {
} }
void ui::Line::comdel(std::ostream &buffer, int x, int y) { void ui::Line::comdel(std::ostream &buffer, int x, int y) {
buffer << "\t\tpath {\n"; buffer << "\t\tline {\n";
buffer << "\t\t\tx:0; y:0;\n"; buffer << "\t\t\tx1: " << (x1 + x) << "; y1: " << (y1 + y) << ";\n";
buffer << "\t\t\tpoints: ("; buffer << "\t\t\tx2: " << (x2 + x) << "; y2: " << (y2 + y) << ";\n";
buffer << "(" << (x1 + x) << ", " << (y1 + y) << "),"; buffer << "\t\t}\n\n";
buffer << "(" << (x2 - x1) << "," << (y2 - y1) << "));\n";
buffer << "\t\t}" << std::endl;
} }
void ui::Bus::render(QGraphicsItemGroup *group, int size) { void ui::Bus::render(QGraphicsItemGroup *group, int size) {
@ -108,12 +104,10 @@ namespace domain {
buffer << "\t\trectangle {\n"; buffer << "\t\trectangle {\n";
buffer << "\t\t\tx: " << (this->x + x) << "; y: " << (this->y + y) << ";\n"; buffer << "\t\t\tx: " << (this->x + x) << "; y: " << (this->y + y) << ";\n";
if (orientation == HORIZONTAL) { if (orientation == HORIZONTAL) {
buffer << "\t\t\twidth: " << size << "; height: " << h << ";\n"; buffer << "\t\t\tw: " << size << "; h: " << h << ";\n";
} else { } else {
buffer << "\t\t\twidth: " << w << "; height: " << size << ";\n"; buffer << "\t\t\tw: " << w << "; h: " << size << ";\n";
} }
buffer << "\t\t\tfill_color: " << this->config.fillColor.name().toStdString() << ";\n";
buffer << "\t\t\tline_color: " << this->config.lineColor.name().toStdString() << ";\n";
buffer << "\t\t}\n\n"; buffer << "\t\t}\n\n";
} }

View File

@ -1,5 +1,4 @@
#include "library.h" #include "library.h"
#include <stdexcept>
namespace domain { namespace domain {
@ -52,7 +51,7 @@ namespace domain {
} }
bool Library::hasComponent(std::string name) { bool Library::hasComponent(std::string name) {
for (unsigned int i = 0; i < components.size(); i++) { for (uint i = 0; i < components.size(); i++) {
if (components[i].getName() == name) { if (components[i].getName() == name) {
return true; return true;
} }
@ -61,7 +60,7 @@ namespace domain {
} }
bool Library::hasBus(std::string name) { bool Library::hasBus(std::string name) {
for (unsigned int i = 0; i < buses.size(); i++) { for (uint i = 0; i < buses.size(); i++) {
if (buses[i].getName() == name) { if (buses[i].getName() == name) {
return true; return true;
} }
@ -71,30 +70,30 @@ namespace domain {
AddressSpace &Library::getAddressSpace(std::string addressSpace) { AddressSpace &Library::getAddressSpace(std::string addressSpace) {
for (unsigned int i = 0; i < addressSpaces.size(); i++) { for (uint i = 0; i < addressSpaces.size(); i++) {
if (addressSpaces[i].getName() == addressSpace) { if (addressSpaces[i].getName() == addressSpace) {
return addressSpaces[i]; return addressSpaces[i];
} }
} }
throw std::runtime_error("no address space with name '" + addressSpace + "'"); throw std::exception();
} }
Component &Library::getComponent(std::string component) { Component &Library::getComponent(std::string component) {
for (unsigned int i = 0; i < components.size(); i++) { for (uint i = 0; i < components.size(); i++) {
if (components[i].getName() == component) { if (components[i].getName() == component) {
return components[i]; return components[i];
} }
} }
throw std::runtime_error("no component with name '" + component + "'"); throw std::exception();
} }
Bus &Library::getBus(std::string bus) { Bus &Library::getBus(std::string bus) {
for (unsigned int i = 0; i < buses.size(); i++) { for (uint i = 0; i < buses.size(); i++) {
if (buses[i].getName() == bus) { if (buses[i].getName() == bus) {
return buses[i]; return buses[i];
} }
} }
throw std::runtime_error("no bus with name '" + bus + "'"); throw std::exception();
} }
@ -103,7 +102,7 @@ namespace domain {
} }
std::optional<Connection> Library::getConnection(ConnectionComponent component, std::string bus) { std::optional<Connection> Library::getConnection(ConnectionComponent component, std::string bus) {
for (unsigned int i = 0; i < connections.size(); i++) { for (uint i = 0; i < connections.size(); i++) {
if (connections[i].isConnecting(component, bus)) { if (connections[i].isConnecting(component, bus)) {
return connections[i]; return connections[i];
} }
@ -117,7 +116,7 @@ namespace domain {
std::optional<Connection> std::optional<Connection>
Library::getConnection(ConnectionComponent component, std::string bus, ConnectionComponent secondComponent) { Library::getConnection(ConnectionComponent component, std::string bus, ConnectionComponent secondComponent) {
for (unsigned int i = 0; i < connections.size(); i++) { for (uint i = 0; i < connections.size(); i++) {
if (connections[i].isConnecting(component, bus, secondComponent)) { if (connections[i].isConnecting(component, bus, secondComponent)) {
return connections[i]; return connections[i];
} }

View File

@ -882,7 +882,7 @@ namespace domain {
if (validator->getName() == function) { if (validator->getName() == function) {
if (validator->getSignature().size() == node.params.size()) { if (validator->getSignature().size() == node.params.size()) {
std::vector<Value> params; std::vector<Value> params;
for (unsigned int j = 0; j < validator->getSignature().size(); j++) { for (uint j = 0; j < validator->getSignature().size(); j++) {
bool exists = false; bool exists = false;
auto type = toType(node.params[j]); auto type = toType(node.params[j]);
if (type.getType() == Value::UNDEFINED) { if (type.getType() == Value::UNDEFINED) {

View File

@ -1,7 +1,6 @@
#include "value.h" #include "value.h"
#include <string> #include <string>
#include <stdexcept>
namespace domain { namespace domain {
@ -45,58 +44,32 @@ namespace domain {
return type == _type; return type == _type;
} }
std::string Value::getTypename() {
switch (type) {
case Value::BOOL:
return "bool";
case Value::INT:
return "int";
case Value::STRING:
return "string";
case Value::ADDRESS_SPACE:
case Value::ADDRESS_SPACE_REFERENCE:
return "address space";
case Value::WIRE_REFERENCE:
return "wire reference";
case Value::ATTRIBUTE_REFERENCE:
return "attribute";
case Value::NIL:
return "null";
case Value::MEMORY:
case Value::MEMORY_REFERENCE:
return "memory";
case Value::UNDEFINED:
return "undefined";
}
return "unknown";
}
long long Value::asInt() { long long Value::asInt() {
if (isType(Value::INT)) { if (isType(Value::INT)) {
return intValue; return intValue;
} }
throw std::runtime_error("expected 'int' but value contains '" + getTypename() + "'"); throw std::exception();
} }
std::string Value::asString() { std::string Value::asString() {
if (isType(Value::STRING)) { if (isType(Value::STRING)) {
return stringValue; return stringValue;
} }
throw std::runtime_error("expected 'string' but value contains '" + getTypename() + "'"); throw std::exception();
} }
bool Value::asBool() { bool Value::asBool() {
if (isType(Value::BOOL)) { if (isType(Value::BOOL)) {
return boolValue; return boolValue;
} }
throw std::runtime_error("expected 'bool' but value contains '" + getTypename() + "'"); throw std::exception();
} }
AddressSpace Value::asAddressSpace() { AddressSpace Value::asAddressSpace() {
if (isType(Value::ADDRESS_SPACE)) { if (isType(Value::ADDRESS_SPACE)) {
return *addressSpace; return *addressSpace;
} }
throw std::runtime_error("expected 'address space' but value contains '" + getTypename() + "'"); throw std::exception();
} }
std::string Value::asReference() { std::string Value::asReference() {
@ -104,7 +77,7 @@ namespace domain {
isType(Value::ATTRIBUTE_REFERENCE) || isType(Value::UNDEFINED)) { isType(Value::ATTRIBUTE_REFERENCE) || isType(Value::UNDEFINED)) {
return reference; return reference;
} }
throw std::runtime_error("expected 'reference' but value contains '" + getTypename() + "'"); throw std::exception();
} }
std::optional<std::string> Value::asMemoryReference() { std::optional<std::string> Value::asMemoryReference() {
@ -120,7 +93,7 @@ namespace domain {
if (isType(Value::INT)) { if (isType(Value::INT)) {
this->intValue = value; this->intValue = value;
} else { } else {
throw std::runtime_error("expected to set 'int' but value contains '" + getTypename() + "'"); throw std::exception();
} }
} }
@ -128,7 +101,7 @@ namespace domain {
if (isType(Value::STRING)) { if (isType(Value::STRING)) {
this->stringValue = value; this->stringValue = value;
} else { } else {
throw std::runtime_error("expected to set 'string' but value contains '" + getTypename() + "'"); throw std::exception();
} }
} }
@ -136,7 +109,7 @@ namespace domain {
if (isType(Value::BOOL)) { if (isType(Value::BOOL)) {
this->boolValue = value; this->boolValue = value;
} else { } else {
throw std::runtime_error("expected to set 'bool' but value contains '" + getTypename() + "'"); throw std::exception();
} }
} }
@ -144,7 +117,7 @@ namespace domain {
if (isType(Value::WIRE_REFERENCE)) { if (isType(Value::WIRE_REFERENCE)) {
this->reference = value; this->reference = value;
} else { } else {
throw std::runtime_error("expected to set 'wire' but value contains '" + getTypename() + "'"); throw std::exception();
} }
} }
@ -218,7 +191,7 @@ namespace domain {
return "null"; return "null";
} }
default: default:
throw std::runtime_error("unknown type couldn't stringify '" + getTypename() + "'"); throw std::exception();
} }
} }

View File

@ -46,7 +46,6 @@ namespace domain {
bool equals(Value value); bool equals(Value value);
std::string string(); std::string string();
std::string getTypename();
ValueType getType(); ValueType getType();

View File

@ -408,7 +408,7 @@ struct WireNode : public AstNode {
bool hidden = false; bool hidden = false;
/** If wire isn't connected to anything it is replaced with terminate with terminateWith value */ /** If wire isn't connected to anything it is replaced with terminate with terminateWith value */
bool hasTerminateWith = false; bool hasTerminateWith;
ValueNode terminateWith; ValueNode terminateWith;
}; };

View File

@ -74,7 +74,7 @@ PError ComdelParser::unexpected() {
} else { } else {
ss << ": "; ss << ": ";
} }
unsigned int token_counter = 0; uint token_counter = 0;
for (auto &type: expectedTokens) { for (auto &type: expectedTokens) {
if (type == TokenType::IDENTIFIER || if (type == TokenType::IDENTIFIER ||
type == TokenType::NUMBER || type == TokenType::NUMBER ||

View File

@ -2,10 +2,10 @@
@info "Primjer ARM biblioteke" @info "Primjer ARM biblioteke"
@directory "." @directory "."
@header ` @header `
// Version 0.0.1 \\ Version 0.0.1
set load_performs_init; set load_performs_init;
` `
@componentHeader " clock 100 MHz;" @componentHeader " clock 100MHz;"
// adresni prostori // adresni prostori
@address adresniProstor(0,0xFFFFFFFF) @address adresniProstor(0,0xFFFFFFFF)
@ -611,7 +611,7 @@ set load_performs_init;
pin { pin {
x: 15; y: 30; w: 10; h: 10; x: 15; y: 30; w: 10; h: 10;
type: "in"; type: "in";
orientation: "bottom"; orientation: "top";
} }
} }
} }
@ -729,9 +729,8 @@ set load_performs_init;
irq wired_or, fiq wired_or, nmreq wired_and, irq wired_or, fiq wired_or, nmreq wired_and,
// hsel_* // hsel_*
sel_mem hidden, sel_bridge, sel_dmac sel_mem hidden, sel_bridge, sel_dmac
sel_mem hidden, sel_bridge, sel_dmac
// dmac // dmac
busreq terminate_with 0, grant busreq, grant
} }
} }

View File

@ -0,0 +1,67 @@
\\ Version 0.0.1
set load_performs_init;
#include ".\arm7tdmi.comdel"
#include ".\decoder.comdel"
#include ".\memory.comdel"
component System
{
clock 100MHz;
//ahb
wire<32> addr;
wire<32> rdata;
wire<32> wdata;
wire<3> size;
wire write;
wired_or ready;
wired_or irq;
wired_or fiq;
wired_and nmreq;
wire --sel_mem;
wire sel_bridge;
wire sel_dmac;
wire busreq;
wire grant;
//gpio_port
wire --xp0;
wire --xp1;
wire --xp2;
wire --xp3;
wire --xp4;
wire --xp5;
wire --xp6;
wire --xp7;
// components --------------------------------------------
subcomponent Memory64KiB memorija(addr, rdata, wdata, size, write, ready, --sel_mem);
subcomponent ARM7tdmi arm(addr, rdata, wdata, size, write, ready, irq, fiq, nmreq, busreq, grant, *, *) uses memorija;
subcomponent Decoder decoder(addr, nmreq, --sel_mem, sel_bridge, sel_dmac, 1, 1);
display {
component { x: -473; y: -283; ref: "arm"; }
component { x: -433; y: 6; ref: "memorija"; }
component { x: -537; y: -202; ref: "decoder"; }
// ahb bus
rectangle {
x: -514; y: -86;
w: 249; h: 20;
}
// gpio_port bus
line {x1:-428; y1:6; x2:-389; y2:-75;}
line {x1:-418; y1:-152; x2:-389; y2:-75;}
line {x1:-517; y1:-172; x2:-389; y2:-75;}
}
}

View File

@ -2,20 +2,20 @@
@schema { @schema {
@instance arm ARM7tdmi { @instance arm ARM7tdmi {
@position (1179, 326) @position (-473, -283)
@attribute _memory memorija @attribute _memory memorija
} }
@instance memorija Memory64KiB { @instance memorija Memory64KiB {
@position (1148, 521) @position (-433, 6)
} }
@instance decoder Decoder { @instance decoder Decoder {
@position (1070, 381) @position (-537, -202)
} }
@instance ahb AHB { @instance ahb AHB {
@position (1027, 465) @position (-514, -86)
@size 249 @size 249
} }

View File

@ -1,67 +0,0 @@
// Version 0.0.1
set load_performs_init;
#include ".\arm7tdmi.comdel"
#include ".\decoder.comdel"
#include ".\memory.comdel"
component System
{
clock 100 MHz;
//ahb
wire<32> addr;
wire<32> rdata;
wire<32> wdata;
wire<3> size;
wire write;
wired_or ready;
wired_or irq;
wired_or fiq;
wired_and nmreq;
wire --sel_mem;
wire sel_bridge;
wire sel_dmac;
wire --ahb__sel_mem;
wire ahb__sel_bridge;
wire ahb__sel_dmac;
wire busreq = 0;
wire grant;
// components --------------------------------------------
subcomponent Memory64KiB memorija(addr, rdata, wdata, size, write, ready, sel_mem);
subcomponent ARM7tdmi arm(addr, rdata, wdata, size, write, ready, irq, fiq, nmreq, busreq, grant) uses memorija;
subcomponent Decoder decoder(addr, nmreq, sel_mem, sel_bridge, sel_dmac, 1, 1);
display {
component { x: 1179; y: 326; ref: "arm"; }
component { x: 1148; y: 521; ref: "memorija"; }
component { x: 1070; y: 381; ref: "decoder"; }
// ahb bus
rectangle {
x: 1027; y: 465;
width: 249; height: 20;
fill_color: #999999;
line_color: #999999;
}
path {
x:0; y:0;
points: ((1153, 521),(-1,-46));
}
path {
x:0; y:0;
points: ((1234, 457),(-82,18));
}
path {
x:0; y:0;
points: ((1090, 421),(62,54));
}
}
}