+ /* Cpu model */
+
+ /** \ingroup SURF_models
+ * \brief CPU model extension public
+ *
+ * Public functions specific to the CPU model.
+ */
+typedef struct surf_cpu_model_extension_public {
+ surf_action_t(*execute) (void *cpu, double size);
+ surf_action_t(*sleep) (void *cpu, double duration);
+ e_surf_resource_state_t(*get_state) (void *cpu);
+ int (*get_core) (void *cpu);
+ double (*get_speed) (void *cpu, double load);
+ double (*get_available_speed) (void *cpu);
+ double (*get_current_power_peak) (void *cpu);
+ double (*get_power_peak_at) (void *cpu, int pstate_index);
+ int (*get_nb_pstates) (void *cpu);
+ void (*set_power_peak_at) (void *cpu, int pstate_index);
+ double (*get_consumed_energy) (void *cpu);
+ void (*add_traces) (void);
+} s_surf_model_extension_cpu_t;
+
+ /* Network model */
+
+ /** \ingroup SURF_models
+ * \brief Network model extension public
+ *
+ * Public functions specific to the network model
+ */
+typedef struct surf_network_model_extension_public {
+ surf_action_t (*communicate) (sg_routing_edge_t src,
+ sg_routing_edge_t dst,
+ double size, double rate);
+ xbt_dynar_t(*get_route) (void *src, void *dst); //FIXME: kill field? That is done by the routing nowadays
+ double (*get_link_bandwidth) (const void *link);
+ double (*get_link_latency) (const void *link);
+ int (*link_shared) (const void *link);
+ void (*add_traces) (void);
+} s_surf_model_extension_network_t;
+
+/* Storage model */
+
+/** \ingroup SURF_models
+ * \brief Storage model extension public
+ *
+ * Public functions specific to the Storage model.
+ */
+
+typedef struct surf_storage_model_extension_public {
+ surf_action_t(*open) (void *storage, const char* mount, const char* path);
+ surf_action_t(*close) (void *storage, surf_file_t fd);
+ surf_action_t(*read) (void *storage, size_t size, surf_file_t fd);
+ surf_action_t(*write) (void *storage, size_t size, surf_file_t fd);
+ surf_action_t(*stat) (void *storage, surf_file_t fd);
+ surf_action_t(*ls) (void *storage, const char *path);
+ xbt_dict_t(*get_properties) (const void *storage);
+ xbt_dict_t(*get_content) (void *storage);
+} s_surf_model_extension_storage_t;
+
+ /** \ingroup SURF_models
+ * \brief Workstation model extension public
+ *
+ * Public functions specific to the workstation model.
+ */
+typedef struct surf_workstation_model_extension_public {
+ surf_action_t(*execute) (void *workstation, double size); /**< Execute a computation amount on a workstation
+ and create the corresponding action */
+ surf_action_t(*sleep) (void *workstation, double duration); /**< Make a workstation sleep during a given duration */
+ e_surf_resource_state_t(*get_state) (void *workstation); /**< Return the CPU state of a workstation */
+
+ int (*get_core) (void *workstation);
+ double (*get_speed) (void *workstation, double load); /**< Return the speed of a workstation */
+ double (*get_available_speed) (void *workstation); /**< Return tha available speed of a workstation */
+
+ double (*get_current_power_peak) (void *workstation); /**< Return the current CPU speed of a workstation */
+ double (*get_power_peak_at) (void *workstation, int pstate_index); /**< Return the speed of a workstation for a specific pstate,
+ (where higher pstate values represent lower processor speeds) */
+ int (*get_nb_pstates) (void *workstation); /**< Return the number of pstates defined for a workstation (default is 1) */
+ void (*set_power_peak_at) (void *workstation, int pstate_index); /**< Set the processor speed of a workstation to the speed associated with the pstate_index pstate */
+ double (*get_consumed_energy) (void *workstation); /**< Return the total energy consumed by a workstation */
+
+ surf_action_t(*communicate) (void *workstation_src, /**< Execute a communication amount between two workstations */
+ void *workstation_dst, double size,
+ double max_rate);
+ // FIXME: kill next field, which duplicates the routing
+ xbt_dynar_t(*get_route) (void *workstation_src, void *workstation_dst); /**< Get the list of links between two ws */
+
+ surf_action_t(*execute_parallel_task) (int workstation_nb, /**< Execute a parallel task on several workstations */
+ void **workstation_list,
+ double *computation_amount,
+ double *communication_amount,
+ double rate);
+ double (*get_link_bandwidth) (const void *link); /**< Return the current bandwidth of a network link */
+ double (*get_link_latency) (const void *link); /**< Return the current latency of a network link */
+ surf_action_t(*open) (void *workstation, const char* storage,
+ const char* path);
+ surf_action_t(*close) (void *workstation, surf_file_t fd);
+ surf_action_t(*read) (void *workstation, size_t size, surf_file_t fd);
+ surf_action_t(*write) (void *workstation, size_t size, surf_file_t fd);
+ surf_action_t(*stat) (void *workstation, surf_file_t fd);
+ int(*unlink) (void *workstation, surf_file_t fd);
+ surf_action_t(*ls) (void *workstation, const char* mount, const char *path);
+ size_t (*get_size) (void *workstation, surf_file_t fd);
+ xbt_dynar_t (*get_info) (void *workstation, surf_file_t fd);
+
+ int (*link_shared) (const void *link);
+ xbt_dict_t(*get_properties) (const void *resource);
+ void (*add_traces) (void);
+
+ size_t (*get_free_size) (void *workstation,const char* name);
+ size_t (*get_used_size) (void *workstation,const char* name);
+ xbt_dynar_t (*get_storage_list) (void *workstation);
+
+} s_surf_model_extension_workstation_t;
+
+
+
+
+/** \ingroup SURF_models
+ * \brief Model datatype
+ *