+++ /dev/null
-#include"scf_eda.h"
-
-#define EDA_INST_OP2_CHECK() \
- if (!c->dsts || c->dsts->size != 1) \
- return -EINVAL; \
- \
- if (!c->srcs || c->srcs->size != 1) \
- return -EINVAL; \
- \
- scf_eda_context_t* eda = ctx->priv; \
- scf_function_t* f = eda->f; \
- \
- scf_3ac_operand_t* dst = c->dsts->data[0]; \
- scf_3ac_operand_t* src = c->srcs->data[0]; \
- \
- if (!src || !src->dag_node) \
- return -EINVAL; \
- \
- if (!dst || !dst->dag_node) \
- return -EINVAL; \
- \
- if (src->dag_node->var->size != dst->dag_node->var->size) {\
- scf_loge("size: %d, %d\n", src->dag_node->var->size, dst->dag_node->var->size); \
- return -EINVAL; \
- }
-
-#define EDA_INST_OP3_CHECK() \
- if (!c->dsts || c->dsts->size != 1) \
- return -EINVAL; \
- \
- if (!c->srcs || c->srcs->size != 2) \
- return -EINVAL; \
- \
- scf_eda_context_t* eda = ctx->priv; \
- scf_function_t* f = eda->f; \
- \
- scf_3ac_operand_t* dst = c->dsts->data[0]; \
- scf_3ac_operand_t* src0 = c->srcs->data[0]; \
- scf_3ac_operand_t* src1 = c->srcs->data[1]; \
- \
- if (!src0 || !src0->dag_node) \
- return -EINVAL; \
- \
- if (!src1 || !src1->dag_node) \
- return -EINVAL; \
- \
- if (!dst || !dst->dag_node) \
- return -EINVAL; \
- \
- if (src0->dag_node->var->size != src1->dag_node->var->size) {\
- scf_loge("size: %d, %d\n", src0->dag_node->var->size, src1->dag_node->var->size); \
- return -EINVAL; \
- }
-
-#define EDA_INST_IN_CHECK(_in, _N) \
- do { \
- int i; \
- if (!(_in)->var->arg_flag) { \
- if ((_in)->n_pins != _N) \
- return -EINVAL; \
- \
- for (i = 0; i < N; i++) { \
- if (!(_in)->pins[i]) \
- return -EINVAL; \
- } \
- } \
- } while (0)
-
-static int _eda_inst_bit_not_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- EDA_INST_OP2_CHECK()
-
- scf_dag_node_t* in = src->dag_node;
- scf_dag_node_t* out = dst->dag_node;
-
- ScfEcomponent* T = NULL;
- ScfEcomponent* R = NULL;
- ScfEcomponent* B = f->ef->components[0];
-
- int i;
- int N = eda_variable_size(in->var);
-
- EDA_INST_IN_CHECK(in, N);
-
- in ->n_pins = N;
- out->n_pins = N;
-
- for (i = 0; i < N; i++) {
-
- EDA_INST_ADD_COMPONENT(f, T, SCF_EDA_Transistor);
- EDA_INST_ADD_COMPONENT(f, R, SCF_EDA_Resistor);
-
- in->pins[i] = T->pins[SCF_EDA_Transistor_B];
-
- EDA_PIN_ADD_COMPONENT(T->pins[SCF_EDA_Transistor_C], R->id, 1);
- EDA_PIN_ADD_COMPONENT(T->pins[SCF_EDA_Transistor_E], B->id, SCF_EDA_Battery_NEG);
-
- EDA_PIN_ADD_COMPONENT(R->pins[0], B->id, SCF_EDA_Battery_POS);
- EDA_PIN_ADD_COMPONENT(R->pins[1], T->id, SCF_EDA_Transistor_C);
-
- out->pins[i] = T->pins[SCF_EDA_Transistor_C];
- }
-
- return 0;
-}
-
-static int _eda_inst_bit_and_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- EDA_INST_OP3_CHECK()
-
- scf_dag_node_t* in0 = src0->dag_node;
- scf_dag_node_t* in1 = src1->dag_node;
- scf_dag_node_t* out = dst ->dag_node;
-
- ScfEcomponent* D0 = NULL;
- ScfEcomponent* D1 = NULL;
- ScfEcomponent* R = NULL;
- ScfEcomponent* B = f->ef->components[0];
-
- int i;
- int N = eda_variable_size(in0->var);
-
- EDA_INST_IN_CHECK(in0, N);
- EDA_INST_IN_CHECK(in1, N);
-
- in0->n_pins = N;
- in1->n_pins = N;
- out->n_pins = N;
-
- for (i = 0; i < N; i++) {
-
- EDA_INST_ADD_COMPONENT(f, D0, SCF_EDA_Diode);
- EDA_INST_ADD_COMPONENT(f, D1, SCF_EDA_Diode);
- EDA_INST_ADD_COMPONENT(f, R, SCF_EDA_Resistor);
-
- in0->pins[i] = D0->pins[SCF_EDA_Diode_NEG];
- in1->pins[i] = D1->pins[SCF_EDA_Diode_NEG];
-
- EDA_PIN_ADD_COMPONENT(D0->pins[SCF_EDA_Diode_POS], D1->id, SCF_EDA_Diode_POS);
- EDA_PIN_ADD_COMPONENT(D0->pins[SCF_EDA_Diode_POS], R ->id, 1);
-
- EDA_PIN_ADD_COMPONENT(D1->pins[SCF_EDA_Diode_POS], D0->id, SCF_EDA_Diode_POS);
- EDA_PIN_ADD_COMPONENT(D1->pins[SCF_EDA_Diode_POS], R ->id, 1);
-
- EDA_PIN_ADD_COMPONENT(R->pins[1], D0->id, SCF_EDA_Diode_POS);
- EDA_PIN_ADD_COMPONENT(R->pins[1], D1->id, SCF_EDA_Diode_POS);
- EDA_PIN_ADD_COMPONENT(R->pins[0], B ->id, SCF_EDA_Battery_POS);
-
- out->pins[i] = R ->pins[1];
- }
-
- return 0;
-}
-
-static int _eda_inst_bit_or_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- EDA_INST_OP3_CHECK()
-
- scf_dag_node_t* in0 = src0->dag_node;
- scf_dag_node_t* in1 = src1->dag_node;
- scf_dag_node_t* out = dst ->dag_node;
-
- ScfEcomponent* D0 = NULL;
- ScfEcomponent* D1 = NULL;
- ScfEcomponent* R = NULL;
- ScfEcomponent* B = f->ef->components[0];
-
- int i;
- int N = eda_variable_size(in0->var);
-
- EDA_INST_IN_CHECK(in0, N);
- EDA_INST_IN_CHECK(in1, N);
-
- in0->n_pins = N;
- in1->n_pins = N;
- out->n_pins = N;
-
- for (i = 0; i < N; i++) {
-
- EDA_INST_ADD_COMPONENT(f, D0, SCF_EDA_Diode);
- EDA_INST_ADD_COMPONENT(f, D1, SCF_EDA_Diode);
- EDA_INST_ADD_COMPONENT(f, R, SCF_EDA_Resistor);
-
- in0->pins[i] = D0->pins[SCF_EDA_Diode_POS];
- in1->pins[i] = D1->pins[SCF_EDA_Diode_POS];
-
- EDA_PIN_ADD_COMPONENT(D0->pins[SCF_EDA_Diode_NEG], D1->id, SCF_EDA_Diode_NEG);
- EDA_PIN_ADD_COMPONENT(D0->pins[SCF_EDA_Diode_NEG], R ->id, 0);
-
- EDA_PIN_ADD_COMPONENT(D1->pins[SCF_EDA_Diode_NEG], D0->id, SCF_EDA_Diode_NEG);
- EDA_PIN_ADD_COMPONENT(D1->pins[SCF_EDA_Diode_NEG], R ->id, 0);
-
- EDA_PIN_ADD_COMPONENT(R->pins[0], D0->id, SCF_EDA_Diode_NEG);
- EDA_PIN_ADD_COMPONENT(R->pins[0], D1->id, SCF_EDA_Diode_NEG);
- EDA_PIN_ADD_COMPONENT(R->pins[1], B ->id, SCF_EDA_Battery_NEG);
-
- out->pins[i] = R ->pins[0];
- }
-
- return 0;
-}
-
-static int _eda_inst_inc_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_inc_post_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_dec_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_dec_post_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_assign_array_index_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- if (!c->srcs || c->srcs->size != 4)
- return -EINVAL;
-
- scf_eda_context_t* eda = ctx->priv;
- scf_function_t* f = eda->f;
-
- scf_3ac_operand_t* base = c->srcs->data[0];
- scf_3ac_operand_t* index = c->srcs->data[1];
- scf_3ac_operand_t* scale = c->srcs->data[2];
- scf_3ac_operand_t* src = c->srcs->data[3];
-
- if (!base || !base->dag_node)
- return -EINVAL;
-
- if (!index || !index->dag_node)
- return -EINVAL;
-
- if (!scale || !scale->dag_node)
- return -EINVAL;
-
- if (!src || !src->dag_node)
- return -EINVAL;
-
- return -EINVAL;
-}
-
-static int _eda_inst_and_assign_array_index_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- if (!c->srcs || c->srcs->size != 4)
- return -EINVAL;
-
- scf_eda_context_t* eda = ctx->priv;
- scf_function_t* f = eda->f;
-
- scf_3ac_operand_t* base = c->srcs->data[0];
- scf_3ac_operand_t* index = c->srcs->data[1];
- scf_3ac_operand_t* scale = c->srcs->data[2];
- scf_3ac_operand_t* src = c->srcs->data[3];
-
- if (!base || !base->dag_node)
- return -EINVAL;
-
- if (!index || !index->dag_node)
- return -EINVAL;
-
- if (!scale || !scale->dag_node)
- return -EINVAL;
-
- if (!src || !src->dag_node)
- return -EINVAL;
-
- return -EINVAL;
-}
-
-static int _eda_inst_or_assign_array_index_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- if (!c->srcs || c->srcs->size != 4)
- return -EINVAL;
-
- scf_eda_context_t* eda = ctx->priv;
- scf_function_t* f = eda->f;
-
- scf_3ac_operand_t* base = c->srcs->data[0];
- scf_3ac_operand_t* index = c->srcs->data[1];
- scf_3ac_operand_t* scale = c->srcs->data[2];
- scf_3ac_operand_t* src = c->srcs->data[3];
-
- if (!base || !base->dag_node)
- return -EINVAL;
-
- if (!index || !index->dag_node)
- return -EINVAL;
-
- if (!scale || !scale->dag_node)
- return -EINVAL;
-
- if (!src || !src->dag_node)
- return -EINVAL;
-
- return -EINVAL;
-}
-
-static int _eda_inst_array_index_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- if (!c->dsts || c->dsts->size != 1)
- return -EINVAL;
-
- if (!c->srcs || c->srcs->size != 3)
- return -EINVAL;
-
- scf_eda_context_t* eda = ctx->priv;
- scf_function_t* f = eda->f;
-
- scf_3ac_operand_t* dst = c->dsts->data[0];
- scf_3ac_operand_t* base = c->srcs->data[0];
- scf_3ac_operand_t* index = c->srcs->data[1];
- scf_3ac_operand_t* scale = c->srcs->data[2];
-
- if (!base || !base->dag_node)
- return -EINVAL;
-
- if (!index || !index->dag_node)
- return -EINVAL;
-
- if (!scale || !scale->dag_node)
- return -EINVAL;
-
- if (!c->instructions) {
- c->instructions = scf_vector_alloc();
- if (!c->instructions)
- return -ENOMEM;
- }
-
- scf_variable_t* vd = dst ->dag_node->var;
- scf_variable_t* vb = base ->dag_node->var;
- scf_variable_t* vi = index->dag_node->var;
- scf_variable_t* vs = scale->dag_node->var;
-
- return -EINVAL;
-}
-
-static int _eda_inst_teq_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_logic_not_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_cmp_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_setz_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_setnz_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_setgt_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_setge_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_setlt_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_setle_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_eq_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_ne_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_gt_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_ge_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_lt_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_le_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_cast_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- if (!c->dsts || c->dsts->size != 1)
- return -EINVAL;
-
- if (!c->srcs || c->srcs->size != 1)
- return -EINVAL;
-
- scf_eda_context_t* eda = ctx->priv;
- scf_function_t* f = eda->f;
- scf_3ac_operand_t* src = c->srcs->data[0];
- scf_3ac_operand_t* dst = c->dsts->data[0];
-
- if (!src || !src->dag_node)
- return -EINVAL;
-
- if (!dst || !dst->dag_node)
- return -EINVAL;
-
- if (0 == dst->dag_node->color)
- return -EINVAL;
-
- return -EINVAL;
-}
-
-static int _eda_inst_return_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- if (!c->srcs || c->srcs->size < 1)
- return -EINVAL;
-
- scf_eda_context_t* eda = ctx->priv;
- scf_function_t* f = eda->f;
- scf_3ac_operand_t* src = NULL;
- scf_dag_node_t* out = NULL;
-
- int i;
- int j;
-
- for (i = 0; i < c->srcs->size; i++) {
- src = c->srcs->data[i];
-
- out = src->dag_node;
-
- if (out->n_pins <= 0) {
- scf_loge("\n");
- return -EINVAL;
- }
-
- for (j = 0; j < out->n_pins; j++)
- out->pins[j]->flags |= SCF_EDA_PIN_OUT;
- }
-
- return 0;
-}
-
-static int _eda_inst_nop_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_end_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_goto_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_jz_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_jnz_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_jgt_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_jge_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_jlt_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_jle_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return -EINVAL;
-}
-
-static int _eda_inst_load_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_reload_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_save_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_assign_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_and_assign_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static int _eda_inst_or_assign_handler(scf_native_t* ctx, scf_3ac_code_t* c)
-{
- return 0;
-}
-
-static eda_inst_handler_t eda_inst_handlers[] =
-{
- {SCF_OP_ARRAY_INDEX, _eda_inst_array_index_handler},
-
- {SCF_OP_TYPE_CAST, _eda_inst_cast_handler},
- {SCF_OP_LOGIC_NOT, _eda_inst_logic_not_handler},
- {SCF_OP_BIT_NOT, _eda_inst_bit_not_handler},
-
- {SCF_OP_INC, _eda_inst_inc_handler},
- {SCF_OP_DEC, _eda_inst_dec_handler},
-
- {SCF_OP_INC_POST, _eda_inst_inc_post_handler},
- {SCF_OP_DEC_POST, _eda_inst_dec_post_handler},
-
- {SCF_OP_BIT_AND, _eda_inst_bit_and_handler},
- {SCF_OP_BIT_OR, _eda_inst_bit_or_handler},
-
- {SCF_OP_3AC_TEQ, _eda_inst_teq_handler},
- {SCF_OP_3AC_CMP, _eda_inst_cmp_handler},
-
- {SCF_OP_3AC_SETZ, _eda_inst_setz_handler},
- {SCF_OP_3AC_SETNZ, _eda_inst_setnz_handler},
- {SCF_OP_3AC_SETGT, _eda_inst_setgt_handler},
- {SCF_OP_3AC_SETGE, _eda_inst_setge_handler},
- {SCF_OP_3AC_SETLT, _eda_inst_setlt_handler},
- {SCF_OP_3AC_SETLE, _eda_inst_setle_handler},
-
- {SCF_OP_EQ, _eda_inst_eq_handler},
- {SCF_OP_NE, _eda_inst_ne_handler},
- {SCF_OP_GT, _eda_inst_gt_handler},
- {SCF_OP_GE, _eda_inst_ge_handler},
- {SCF_OP_LT, _eda_inst_lt_handler},
- {SCF_OP_LE, _eda_inst_le_handler},
-
- {SCF_OP_ASSIGN, _eda_inst_assign_handler},
-
- {SCF_OP_AND_ASSIGN, _eda_inst_and_assign_handler},
- {SCF_OP_OR_ASSIGN, _eda_inst_or_assign_handler},
-
- {SCF_OP_RETURN, _eda_inst_return_handler},
- {SCF_OP_GOTO, _eda_inst_goto_handler},
-
- {SCF_OP_3AC_JZ, _eda_inst_jz_handler},
- {SCF_OP_3AC_JNZ, _eda_inst_jnz_handler},
- {SCF_OP_3AC_JGT, _eda_inst_jgt_handler},
- {SCF_OP_3AC_JGE, _eda_inst_jge_handler},
- {SCF_OP_3AC_JLT, _eda_inst_jlt_handler},
- {SCF_OP_3AC_JLE, _eda_inst_jle_handler},
-
- {SCF_OP_3AC_NOP, _eda_inst_nop_handler},
- {SCF_OP_3AC_END, _eda_inst_end_handler},
-
- {SCF_OP_3AC_SAVE, _eda_inst_save_handler},
- {SCF_OP_3AC_LOAD, _eda_inst_load_handler},
-
- {SCF_OP_3AC_RESAVE, _eda_inst_save_handler},
- {SCF_OP_3AC_RELOAD, _eda_inst_reload_handler},
-
- {SCF_OP_3AC_ASSIGN_ARRAY_INDEX, _eda_inst_assign_array_index_handler},
- {SCF_OP_3AC_AND_ASSIGN_ARRAY_INDEX, _eda_inst_and_assign_array_index_handler},
- {SCF_OP_3AC_OR_ASSIGN_ARRAY_INDEX, _eda_inst_or_assign_array_index_handler},
-};
-
-eda_inst_handler_t* scf_eda_find_inst_handler(const int op_type)
-{
- int i;
- for (i = 0; i < sizeof(eda_inst_handlers) / sizeof(eda_inst_handlers[0]); i++) {
-
- eda_inst_handler_t* h = &(eda_inst_handlers[i]);
-
- if (op_type == h->type)
- return h;
- }
- return NULL;
-}