dokoncene parsovanie a preklad asynchronych modelov.
This commit is contained in:
parent
0c80fb53fe
commit
2712cecaa9
@ -36,7 +36,7 @@ namespace DEVS
|
||||
int ModelDefinition::addRule(string &name, string &rule)
|
||||
{
|
||||
if(rules.count(name))return -1;
|
||||
rules[name] = "_event "+name+"(_state current_state, _time current_time, _event *event_vector, _seed *seed){\n"+rule+"}\n";
|
||||
rules[name] = "_event "+name+"(_state current_state, _time current_time, _event *event_vector, _seed *seed){_event new_event;\n"+rule+"}\n";
|
||||
transfer_func_declaration += "_event "+name+"(_state current_state, _time current_time, _event *event_vector, _seed *seed);\n";
|
||||
return 0;
|
||||
}
|
||||
|
@ -96,27 +96,26 @@ namespace DEVS
|
||||
ss << "_event transfer_func(_state current_state, _time current_time, _event *event_vector, _seed *seed){" << endl;
|
||||
ss << "size_t x,y;\nx = get_global_id(0);\ny = get_global_id(1);" << endl;
|
||||
ss << model.zones;
|
||||
ss << "else " << model.section.local_transition << "(current_state, current_time, event_vector, seed);}" << endl;
|
||||
ss << "else return " << model.section.local_transition << "(current_state, current_time, event_vector, seed);}" << endl;
|
||||
ss << endl;
|
||||
|
||||
ss << neighbors();
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
string neighbors()
|
||||
{
|
||||
vector<string> n;
|
||||
n.resize(model.section.neighbors_index.size()+1);
|
||||
n.resize(model.section.neighbors_index.size());
|
||||
for(map<string, int>::iterator i = model.section.neighbors_index.begin(); i != model.section.neighbors_index.end();i++)
|
||||
{
|
||||
n[i->second] = i->first;
|
||||
}
|
||||
stringstream ss;
|
||||
ss << "__constant int2 neighbors[] = {";
|
||||
ss << "__constant int neighbors[] = {";
|
||||
for(unsigned int i=0;i<n.size();i++)
|
||||
{
|
||||
ss << "(int2)" << n[i];
|
||||
if(i<n.size()-1)ss << ", ";
|
||||
string s;
|
||||
s = n[i].substr(1, n[i].length()-2);
|
||||
ss << s << ", ";
|
||||
}
|
||||
ss << "};\n";
|
||||
return ss.str();
|
||||
|
@ -860,7 +860,7 @@ namespace DEVS {
|
||||
|
||||
/* Line 678 of lalr1.cc */
|
||||
#line 133 "parser.yy"
|
||||
{ (yyval.stringVal) = NEWSTR; if(*(yysemantic_stack_[(1) - (1)].stringVal)=="(0,0)")*(yyval.stringVal) = "current_state"; else *(yyval.stringVal) = "event_vector["+driver->toString(driver->model.section.neighbors_index[*(yysemantic_stack_[(1) - (1)].stringVal)])+"].y"; delete (yysemantic_stack_[(1) - (1)].stringVal); }
|
||||
{ (yyval.stringVal) = NEWSTR; if(*(yysemantic_stack_[(1) - (1)].stringVal)=="(0,0)")*(yyval.stringVal) = "current_state"; else *(yyval.stringVal) = "event_vector["+driver->toString(driver->model.section.neighbors_index[*(yysemantic_stack_[(1) - (1)].stringVal)])+"].state"; delete (yysemantic_stack_[(1) - (1)].stringVal); }
|
||||
break;
|
||||
|
||||
case 48:
|
||||
|
@ -130,7 +130,7 @@ REALEXP : IDREF { $$=NEWSTR; *$$ = *$1; delete $1; }
|
||||
| REALEXP MUL REALEXP { $$=NEWSTR; *$$ = *$1+"*"+*$3; delete $1; delete $3; }
|
||||
| REALEXP DIV REALEXP { $$=NEWSTR; *$$ = *$1+"/"+*$3; delete $1; delete $3; }
|
||||
|
||||
IDREF : CELLREF { $$ = NEWSTR; if(*$1=="(0,0)")*$$ = "current_state"; else *$$ = "event_vector["+driver->toString(driver->model.section.neighbors_index[*$1])+"].y"; delete $1; }
|
||||
IDREF : CELLREF { $$ = NEWSTR; if(*$1=="(0,0)")*$$ = "current_state"; else *$$ = "event_vector["+driver->toString(driver->model.section.neighbors_index[*$1])+"].state"; delete $1; }
|
||||
| CONSTANT { $$=NEWSTR; *$$ = driver->toString($1); }
|
||||
| FUNCTION { $$ = $1; }
|
||||
| PORTVALUE LBRACKET PORTNAME RBRACKET { $$=NEWSTR; *$$ = "portValue("+*$3+")"; delete $3; }
|
||||
|
@ -8,6 +8,9 @@ AsynchronousModel::AsynchronousModel(Machine *parent, string model_definition) :
|
||||
{
|
||||
queue_len = 8;
|
||||
neighbor = 8;
|
||||
init_kernel = 0;
|
||||
intermediate_kernel = 0;
|
||||
compile(model_definition);
|
||||
loadSource();
|
||||
}
|
||||
|
||||
@ -27,11 +30,15 @@ int AsynchronousModel::getCellSize()
|
||||
void AsynchronousModel::loadSource()
|
||||
{
|
||||
stringstream s;
|
||||
s << "-I./kernels/ -D NEIGHBOR=" << neighbor << " -D QUEUE_LEN=" << queue_len;
|
||||
string source = "__constant int neighbors[] = {-1,1, 1,1, -1,-1, 1,-1, 0,1, -1,0, 1,0, 0,-1, 0,0 };\n";
|
||||
source += "#include \"asynchr.cl\"";
|
||||
s << getKernelInclude() << " -D NEIGHBOR=" << neighbor << " -D QUEUE_LEN=" << queue_len;
|
||||
string source = neighbors;//"__constant int neighbors[] = {-1,1, 1,1, -1,-1, 1,-1, 0,1, -1,0, 1,0, 0,-1, 0,0 };\n";
|
||||
source += "#include \"asynchr.cl\"\n";
|
||||
source += transfer_functions;
|
||||
cout << source << endl;
|
||||
build(source, s.str());
|
||||
|
||||
if(init_kernel)clReleaseKernel(init_kernel);
|
||||
if(intermediate_kernel)clReleaseKernel(intermediate_kernel);
|
||||
init_kernel = clCreateKernel(program, "init", NULL);
|
||||
intermediate_kernel = clCreateKernel(program, "intermediateStep", NULL);
|
||||
}
|
||||
@ -48,9 +55,12 @@ void AsynchronousModel::renderToTexture(CellSpace *pattern, int which, cl_mem te
|
||||
int AsynchronousModel::compile(string model_definition)
|
||||
{
|
||||
DEVS::CDparser *parser = new DEVS::CDparser(model_definition);
|
||||
parser->parse();
|
||||
int ret = parser->parse();
|
||||
error_message = parser->error.str();
|
||||
neighbors = parser->neighbors();
|
||||
transfer_functions = parser->compiledSource();
|
||||
delete parser;
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
string AsynchronousModel::getError()
|
||||
|
@ -167,6 +167,7 @@ void CellulaMainWindow::createDock()
|
||||
log = new QDockWidget(trUtf8("Log"), this);
|
||||
log->setObjectName("log_dock");
|
||||
QTextEdit *text = new QTextEdit();
|
||||
text->setReadOnly(true);
|
||||
LuaConsole *lua = new LuaConsole();
|
||||
log->setWidget(text);
|
||||
log->setFeatures(QDockWidget::DockWidgetVerticalTitleBar | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
|
||||
|
@ -10,11 +10,11 @@ __constant uint colors[] = {0,0,0,0, 255,255,255,0, 255,0,0,0, 0,255,0,0, 0,0,25
|
||||
|
||||
// sem pojdu prechodove funkcie funkcie
|
||||
|
||||
_event transfer_func(_state current_state, _time current_time, _event *event_vector, _seed *seed)
|
||||
/*_event transfer_func(_state current_state, _time current_time, _event *event_vector, _seed *seed)
|
||||
{
|
||||
_event new_event;
|
||||
if(current_state >= 1.0f && (DEVS_truecount() == 3 || DEVS_truecount() == 2)){ new_event.time = 100; new_event.state = 1; return new_event; }
|
||||
if(current_state == 0.0f && (DEVS_truecount() == 3)){ new_event.time = 100; new_event.state = 1; return new_event; }
|
||||
if(true){ new_event.time = 100; new_event.state = 0; return new_event; }
|
||||
}
|
||||
|
||||
*/
|
||||
|
@ -46,6 +46,9 @@ takeStep a renderToTexture ktore su potom pouzivane.
|
||||
*/
|
||||
cl_int Model::build(string source, string options)
|
||||
{
|
||||
if(kernel)clReleaseKernel(kernel);
|
||||
if(render_kernel)clReleaseKernel(render_kernel);
|
||||
if(program)clReleaseProgram(program);
|
||||
cl_int err_code;
|
||||
//size_t len[] = { source.length() };
|
||||
program = parent->createProgram(source);
|
||||
|
2
model.h
2
model.h
@ -101,6 +101,7 @@ class SynchronousModel : public Model
|
||||
private:
|
||||
string nodes;
|
||||
int num_states, num_neighbors, num_nodes;
|
||||
string error_message;
|
||||
};
|
||||
|
||||
class AsynchronousModel : public Model
|
||||
@ -109,6 +110,7 @@ class AsynchronousModel : public Model
|
||||
int queue_len,neighbor;
|
||||
cl_kernel init_kernel,intermediate_kernel;
|
||||
string error_message;
|
||||
string neighbors, transfer_functions;
|
||||
public:
|
||||
AsynchronousModel(Machine* parent, string model_definition);
|
||||
~AsynchronousModel();
|
||||
|
@ -53,6 +53,7 @@ void SynchronousModel::renderToTexture(CellSpace *pattern, int which, cl_mem tex
|
||||
|
||||
int SynchronousModel::compile(string model_definition)
|
||||
{
|
||||
error_message.clear();
|
||||
num_neighbors = num_nodes = num_states = 0;
|
||||
stringstream ss(model_definition);
|
||||
stringstream serr;
|
||||
@ -79,7 +80,7 @@ int SynchronousModel::compile(string model_definition)
|
||||
case TreeScanner::NEIGHBORS: state = 1; break;
|
||||
case TreeScanner::STATES: state = 2; break;
|
||||
case TreeScanner::NODES: state = 4; break;
|
||||
case TreeScanner::END: if(loaded!=7)return -1; break;
|
||||
case TreeScanner::END: if(loaded!=7){ error_message = "Incomplete model definition"; return -1; } break;
|
||||
}
|
||||
token = scanner.lex(&val);
|
||||
}
|
||||
@ -90,7 +91,7 @@ int SynchronousModel::compile(string model_definition)
|
||||
for(int o=0;o<num_states;o++)
|
||||
{
|
||||
token = scanner.lex(&val);
|
||||
if(token!=TreeScanner::NUMBER)return -1;
|
||||
if(token!=TreeScanner::NUMBER){ error_message = "Incomplete model definition"; return -1; }
|
||||
n << val << ", ";
|
||||
}
|
||||
n << " ";
|
||||
@ -102,7 +103,7 @@ int SynchronousModel::compile(string model_definition)
|
||||
|
||||
string SynchronousModel::getError()
|
||||
{
|
||||
return "";
|
||||
return error_message;
|
||||
}
|
||||
|
||||
int SynchronousModel::loadRLE(istream &fr, size_t *w, size_t *h, CellType **data)
|
||||
|
@ -91,15 +91,18 @@ void TextEditor::setName(const QString &name)
|
||||
int TextEditor::compile(QTextEdit *log)
|
||||
{
|
||||
string source = document.toPlainText().toStdString();
|
||||
model->compile(source);
|
||||
if(log)
|
||||
int ret = model->compile(source);
|
||||
if(log && ret)
|
||||
{
|
||||
log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
|
||||
QTextCursor t = log->textCursor();
|
||||
t.insertBlock();
|
||||
string err = model->getError();
|
||||
t.insertText(err.c_str());
|
||||
log->ensureCursorVisible();
|
||||
}
|
||||
if(ret)QMessageBox::warning(this, trUtf8("Chyba pri parsovani"), trUtf8("Nepodarilo sa sparsovať definiciu modelu"));
|
||||
else model->loadSource();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user